Announcement

Collapse
No announcement yet.

CASE Abfrage über drei Tabellen mit JOIN

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • CASE Abfrage über drei Tabellen mit JOIN

    Hallo, ich habe da ein Problem das ich alleine nicht in den Griff bekomme.

    Ich habe insgesammt drei Tabellen und muss in einer einen Wert setzten, dafür muss ich über alle anderen Tabellen gehen.

    1.Tabelle: daten1: Spalten zur Zuordung: quelle, ziel, begin(datetime)

    2.Tabelle daten2: user_id(ist identisch mit einem wert aus quelle oder ziel), kundenid(zu einer kundenid gehören 10 user_id's)

    3.Tabelle daten3: kundenid(identisch mit(daten2.kundenid),letztenutzung

    ich möchte in daten3.letztenutzung einen von drei Werten haben. die Möglichkeiten der Werte sind:
    - 0 bei daten1.begin(datetimewert) < 30 Tage unterschied von heute
    - 1 bei daten1.begin(datetimewert) >30 Tage <=90 Tage unterschied von heute
    - 2 bei daten1.begin(datetimewert) >90 Tage unterschied von heute

    ich habe eine Abfrage mit if hinbekommen, die sieht so aus:

    UPDATE daten3
    SET letztenutzung=(IF
    (DATE_ADD(
    (SELECT MAX(daten1.begin)
    FROM daten1
    LEFT JOIN daten2
    ON daten1.ziel=daten2.user_id
    OR daten1.quelle=daten2.user_id
    WHERE daten2.kundenid=1001),
    INTERVAL 90 DAY)
    < NOW(), '1','2')
    );

    damit bekomme ich das für eine bestimmte ID hin. Aber wie mache ich mit so einer(für mich komplizierten) Abfrage mit einem CASE?

    Ich bin für jede Hilfe dankbar. Super wäre wenn ihr mir nicht nur die Abfrage gebt, sondern auch eine Erklärung dazu.
    Danke
    Zuletzt editiert von elric; 03.09.2009, 18:13.

  • #2
    Ich glaub mit Case geht das gar nicht, weil case (oder auch switch-case) in programmiersprachen nur konkrete Werte untersützt. Alles andere muss man mit if then else anweisungen bauen.

    Siehe auch hier:

    http://dev.mysql.com/doc/refman/5.1/...functions.html

    Comment


    • #3
      OK das war jetzt schmarrn... hab dann auch mal vernünftig in dem manual geschmökert *g*

      select case when tage < 30 then 0
      when 30 < tage < 90 then 1
      else 2

      Das sollte doch eigentlich das Hauptproblem gewesen sein, oder? Diese update kommando auseinander zu pfriemeln war mir etwas zu umständlich bitte schöner formatieren

      Comment


      • #4
        OK mir is grad langweilig:

        [highlight=sql]
        UPDATE daten3
        SET letztenutzung =
        (
        SELECT CASE WHEN datum < AddDays(NOW(), 30) then 0
        WHEN datum >= AddDays(NOW(), 30) AND datum < AddDays(NOW(), 90) then 1
        ELSE 2
        FROM
        (
        SELECT MAX(daten1.begin) as datum
        FROM daten1
        LEFT JOIN daten2
        ON daten1.ziel=daten2.user_id OR daten1.quelle=daten2.user_id
        WHERE daten2.kundenid=daten3.kundenid
        )
        )
        [/highlight]

        Keine 100% Garantie für den Code... aber so in der Art sollte es wohl aussehen

        Comment


        • #5
          Super, das werde ich mal ausprobieren.

          Danke, ich habe mit meiner if anweisung den ganzen tag verbracht.

          Ich habe da noch eine frage. wie muss ich die abfrage umbauen, das ich alle vorhanden kundenid's abfragen kann, um so nicht tausende einzelne abfragen zu haben?

          Comment


          • #6
            das ist schon drin...

            Code:
            WHERE daten2.kundenid=daten3.kundenid

            Comment


            • #7
              So, ich habe jetzt die original tabellennamen dringelassen.
              wenn ich das ausführe
              Code:
              UPDATE nutzer SET 
              letztenutzung=(SELECT CASE WHEN 
              datum < AddDays(NOW(), 30) 
              then 0 
              WHEN datum >= AddDays(NOW(), 30) AND datum < AddDays(NOW(), 90) 
              then 1 
              ELSE 2 
              FROM (SELECT MAX(verkehrsdaten.begin) AS datum FROM verkehrsdaten 
              LEFT JOIN userxml 
              ON verkehrsdaten.ziel=userxml.user_id 
              OR verkehrsdaten.quelle=userxml.user_id 
              WHERE userxml.kundenid=nutzer.kundenid)
              );
              dann bekomme ich die fehlermelung:
              error sql-syntax near 'FROM (SELECT MAX(verkehrsdaten.begin) AS datum FROM verkehrsdaten LEFT JOIN use'

              wo liegt denn nun der fehler?

              Comment


              • #8
                na bissl selber schauen könnte man schon bin kein MySQL Experte... ehrlich gesagt hatte ich mit der Datenbank noch nie was zu tun.
                Aber da fehlt vom CASE das END CASE und das steht vor FROM

                [highlight=sql]
                UPDATE nutzer SET
                letztenutzung=
                (
                SELECT CASE
                WHEN datum < AddDays(NOW(), 30) then 0
                WHEN datum >= AddDays(NOW(), 30) AND datum < AddDays(NOW(), 90) then 1
                ELSE 2
                END CASE
                FROM
                (
                SELECT MAX(verkehrsdaten.begin) AS datum
                FROM verkehrsdaten
                LEFT JOIN userxml
                ON verkehrsdaten.ziel=userxml.user_id
                OR verkehrsdaten.quelle=userxml.user_id
                WHERE userxml.kundenid=nutzer.kundenid
                )
                );
                [/highlight]

                Wenn das nicht gleich funktioniert, dann von innen nach aussen durchprobieren.

                Heisst:

                Zuerst schauen ob hier das richtige für eine konkrete Id rauskommt:

                [highlight=sql]
                SELECT MAX(verkehrsdaten.begin) AS datum
                FROM verkehrsdaten
                LEFT JOIN userxml
                ON verkehrsdaten.ziel=userxml.user_id
                OR verkehrsdaten.quelle=userxml.user_id
                WHERE userxml.kundenid=3
                [/highlight]

                Wenn das geht dann das probieren:

                [highlight=sql]
                SELECT CASE
                WHEN datum < AddDays(NOW(), 30) then 0
                WHEN datum >= AddDays(NOW(), 30) AND datum < AddDays(NOW(), 90) then 1
                ELSE 2
                END CASE
                FROM
                (
                SELECT MAX(verkehrsdaten.begin) AS datum
                FROM verkehrsdaten
                LEFT JOIN userxml
                ON verkehrsdaten.ziel=userxml.user_id
                OR verkehrsdaten.quelle=userxml.user_id
                WHERE userxml.kundenid=3
                )
                [/highlight]

                Und wenn das geht dann:

                [highlight=sql]
                SELECT n.*, last.*
                FROM nutzer n,
                (
                SELECT CASE
                WHEN datum < AddDays(NOW(), 30) then 0
                WHEN datum >= AddDays(NOW(), 30) AND datum < AddDays(NOW(), 90) then 1
                ELSE 2
                END CASE
                FROM
                (
                SELECT MAX(verkehrsdaten.begin) AS datum
                FROM verkehrsdaten
                LEFT JOIN userxml
                ON verkehrsdaten.ziel=userxml.user_id
                OR verkehrsdaten.quelle=userxml.user_id
                WHERE userxml.kundenid=n.kundenid
                )
                ) last
                [/highlight]

                So jetzt hab ich genügend vorgekaut. Ein bischen selbst Erfahrung sammeln schadet auch nicht...
                Zuletzt editiert von fanderlf; 03.09.2009, 22:28.

                Comment


                • #9
                  Danke, war wohl gestern ein bisschen spät. das mit dem END CASE habe ich nicht gesehen.

                  Comment


                  • #10
                    hats denn funktioniert?

                    Comment


                    • #11
                      muss ich gleich noch testen. ich hatte noch keine zeit. musste mich um meine 12 wochen alte tochter kümmern. jetzt gehe ich noch kurz arbeiten und dann werde ich mich weiter mit dem server beschäftigen. ich melde mich dann.

                      Comment


                      • #12
                        ich habe ds noch nicht geschafft!

                        ich habe deine hinweise befolgt und dann mal im einzelverfahren getestet.
                        die erste abfrage mit datum funktioniert. wenn ich dann mit dem case zusammen die abfrage mache, bekomme ich die fehlermeldung every derived table must have its own alias. das hast wohl was mit dem datum zu tun. ich werde mal weiter tüffteln, vielleicht fällt euch ja noch was ein

                        Comment

                        Working...
                        X