[SQL allgemein] JOIN mit bestimmten Datensatz

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [SQL allgemein] JOIN mit bestimmten Datensatz

    Hallo,

    Ich habe zwei Tabellen, A und B (=order_status) mit 1:n Beziehung. Bei einer Abfrage möchte ich nun alle Datensätze aus A auslesen und jeweils einen zugehörigen Datensatz aus B, und zwar genau den, bei dem ein bestimmtes Feld (time) am größten ist.

    Nach ein bisschen Googlen habe ich folgende Lösung gefunden:

    Code:
    LEFT JOIN (SELECT orderId,max(time) AS time ,status FROM order_status GROUP BY orderId) S ON O.id=S.orderId
    Jetzt sucht er sich schonmal die größte "time" raus, ich will aber, dass zu genau dem Datensatz auch der "status" abgefragt wird. Da holt er sich aber irgendeinen.

    Im Prinzip will ich zu jedem Datensatz in Tabelle A genau den einen Datensatz aus B mit max(time) haben.

    Wie setze ich das um?

    Vielen Dank!

  • #2
    Was spricht dagegen es in die WHERE-Bedingung aufzunehmen?

    Alternativ ginge auch ON.

    Kommentar


    • #3
      Original geschrieben von TobiaZ
      Was spricht dagegen es in die WHERE-Bedingung aufzunehmen?

      Alternativ ginge auch ON.
      Hallo TobiaZ, danke für die Antwort, ich habe erst jetzt zeit gefunden weiter daran zu arbeiten.

      Was meinst du denn mit "Where" Bedingung?
      Ein "WHERE max(time)" funktioniert leider nicht...

      Grüße

      Kommentar


      • #4
        Re: [SQL allgemein] JOIN mit bestimmten Datensatz

        Versuch doch bitte folgendes:

        Code:
        LEFT JOIN (SELECT orderId,max(time) AS maxTime ,status FROM order_status HAVING time=maxTime) S ON O.id=S.orderId
        Aber die vollständige Abfrage würde mir da mehr helfen das nachzuvollziehen.

        Kommentar


        • #5
          Re: Re: [SQL allgemein] JOIN mit bestimmten Datensatz

          Original geschrieben von alex2iceman
          Versuch doch bitte folgendes:

          Code:
          LEFT JOIN (SELECT orderId,max(time) AS maxTime ,status FROM order_status HAVING time=maxTime) S ON O.id=S.orderId
          Aber die vollständige Abfrage würde mir da mehr helfen das nachzuvollziehen.
          Genau der falsche Ansatz. Man merkt, dass die meistens PHP-Entwickler keine vernünftige SQL-Query schreiben können, da MySQL ein Sch**ß-DBMS ist, welches sich nicht an die Regel hält, vor allem bei GROUP BY!

          Die Lösung ist: die Subquery mit der selbigen Tabelle zu joinen, um die restlichen Daten von dem Datensatz mit dem max-Wert zu holen, e.g.
          PHP-Code:
          SELECT O.orderIdS.timeO.status FROM order_status O 
             INNER JOIN 
          (SELECT orderId,max(time) AS time FROM order_status GROUP BY orderId
                ON O
          .orderId=S.orderId 

          Kommentar


          • #6
            Hallo asp2php,

            Leider hab ich deine Lösung entweder falsch umgesetzt oder sie funktioniert so nicht.

            Die tabellenstruktur ist wie gehabt, orders 1:n order_status, ich will aus order_status den einen Datensatz mit max(time) haben und die entsprechenden Daten aus orders.

            Code:
            SELECT 
            	--felder--
            FROM order_status X
            INNER JOIN (SELECT orderId,max(time) AS time FROM order_status GROUP BY orderId) S 
            	ON X.orderId=S.orderId
            
            LEFT JOIN orders O ON O.id=X.orderId
            	--weitere joins--
            WHERE 
            	--bedingungen--
            Diese Abfrage gibt mir jetzt alle Datensätze aus order_status zurück...

            /edit:
            habe es jetzt gelöst, unter den Bedingungen noch ein AND X.time=S.time eingefügt.

            Grüße und danke!
            Zuletzt geändert von OliOli; 21.10.2008, 18:03.

            Kommentar

            Lädt...
            X