Announcement

Collapse
No announcement yet.

Zwei Tabellen kombinieren (LIMIT)

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

  • Zwei Tabellen kombinieren (LIMIT)

    Hallo,

    ich habe lange überlegt und komme leider immer noch zu keiner Lösung.

    Ich habe zurzeit mehrere Tabellen, die ich in eine Abfrage per JOINs verknüpfe. Es handelt sich hierbei um Aufträge von Kunden, die an unterschiedlichen Tagen eine Statusveränderung haben. Z.B.:

    ID | Datum | Status
    5 | 20.10.10 | Lieferung
    5 | 21.10.10 | Abgerechnet
    5 | 23.10.10 | Telefonat

    Nun möchte ich zu jedem einzelnen Auftrag allerdings nur den letzten, also den aktuellsten, Termin ausgegeben bekommen. Bisher realisiere ich dies über eine zweite Abfrage, in der ich per LIMIT 1 DESC nur die letzte Änderung erhalte (PHP).

    Diese beiden Abfragen (Ausgabe der Aufträge und die Selektierung des aktuellsten Termins) möchte ich nun mit einer Abfrage realisieren. Ich habe an Subselects gedacht, mit den LIMITs experimentiert... Bin bisher aber noch auf keine Lösung gestossen.

    Zusammenfassung:
    Es sollen alle Aufträge, allerdings nur mit dem letzten Datum, ausgegeben werden.

    Habt ihr vielleicht einen Denkanstoss für mich? Kann ich hier so etwas wie MAX(datum) verwenden?

    Vielen Dank!
    Cosy

  • #2
    Ich scheine eine funktionierende Lösung gefunden zu haben:

    Code:
    SELECT id, MAX(datum), auftrag_id
    FROM auftrag LEFT JOIN termin ON auftrag.id = termin.auftrag_id
    GROUP BY auftrag.id;
    Das nur als Kurzfassung, mein Codeschnipsel ist natürlich um Weiten länger .

    Comment


    • #3
      Hallo,

      vlt.ist auch das: Bei "doppelten" Datensätzen nur einen anzeigen hilfreich.

      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Danke für den Link, nur leider bekomme ich das so nicht hin. Er sagt mir immer, es gäbe keine Tabelle 'a'. Mein Code oben funktioniert zwar soweit, allerdings habe ich eine dritte Tabelle, die noch integriert werden muss.
        Zusätlich zur ID und dem Datum brauche ich noch die Änderung, wie z.B. 'abgerechnet'. Per JOIN werden auch Änderungen ausgegeben - allerdings nun willkürlich und nicht dem Eintrag des letzten Datums angehörend.

        SELECT id, MAX(datum), auftrag_id, status, termin_id
        FROM auftrag
        LEFT JOIN termin ON auftrag.id = termin.auftrag_id
        LEFT JOIN status ON status.termin_id = termin.id
        GROUP BY auftrag.id;
        id | MAX(datum) | status
        5 | 23.10.10. | Lieferung
        2 | 14.09.10 | Telefonat

        Wenn ich noch nach dem Datum gruppiere, stimmen die Zugehörigkeiten wieder, allerdings sind wieder mehrere Ausgaben vorhanden:
        SELECT id, MAX(datum), auftrag_id, status, termin_id
        FROM auftrag
        LEFT JOIN termin ON auftrag.id = termin.auftrag_id
        LEFT JOIN status ON status.termin_id = termin.id
        GROUP BY auftrag.id,
        date_format(datum,'%Y') DESC,
        date_format(datum,'%m') DESC,
        date_format(datum,'%d.') DESC;
        id | MAX(datum) | status
        5 | 20.10.10 | Lieferung
        5 | 21.10.10 | Abgerechnet
        5 | 23.10.10 | Telefonat
        2 | 09.09.10 | Telefonat
        2 | 14.09.10 | Bestellung

        Die Ausgabe so aussehen:
        id | MAX(datum) | status
        5 | 23.10.10 | Telefonat
        2 | 14.09.10 | Bestellung

        Ich bin für alle Denkanstöße dankbar!

        Comment


        • #5
          Lösung

          Es klappt einwandfrei und ich springe gerade im Dreieck !

          Hier also meine Lösung:
          SELECT id, datum, status
          FROM auftrag
          LEFT JOIN datum ON auftrag.id = datum.auftrag_id
          AND datum.datum =
          (SELECT MAX(datum) FROM datum WHERE auftrag.id = datum.datum_auftrag_id)
          LEFT JOIN status ON status.datum_id = datum.id
          ORDER BY id;
          Danke für die Hilfe!

          Comment

          Working...
          X