Newbe: Jeder Datensatz aus 1 soll den jeweils maximalen Datensatz aus 2

Hallo,

ich benutze PHP und MySQL.

Meine Datenbank sieht schematisch so aus:

X:
ID,NAME

Y:
ID,X_ID,WERT,DATUM

Zu jedem X gibt es mehrere Y Datensätze. Diese werden mit einander verknüpft durch ID in X und X_ID in Y.

Mein Ziel ist es aus Y den WERT zu ermitteln, der weiter zurück liegt als das übergebene DATUM aber der jenige Datensatz ist der dem DATUM am nächsten ist.

Beispiel zur Verdeutlichung:

X:
1,Affe
2,Hund

Y:
1,1,schläft,11.11.2008 10:23:00
2,2,wach,11.11.2008 14:23:00
3,1,wach,12.11.2008 01:11:00
4,1,schläft,12.11.2008 05:00:00

Bei einer Abfrage mit DATUM 11.11.2008 18:00:00 soll folgendes Ergebnis erscheinen:

1,Affe,schläft
2,Hund,wach

Bei einer Abfrage mit DATUM 12.11.2008 04:59:00 soll folgendes Ergebnis erscheinen:

1,Affe,wach
2,Hund,wach

Vielen Dank schonmal für die vielen netten Antworten. Hoffe die Fragen sind verständlich gestellt.

Grüße

  1. Hallo,

    ich benutze PHP und MySQL.

    PHP ist bei Datenbankfragen irrelevant, die Version von MySQL ist dagegen relevant.

    Mein Ziel ist es aus Y den WERT zu ermitteln, der weiter zurück liegt als das übergebene DATUM aber der jenige Datensatz ist der dem DATUM am nächsten ist.

    schön, dass Du ein Beispiel bringst, noch schöner wäre es in tabellarischer Form.

    Beispiel zur Verdeutlichung:

    X:
    1,Affe
    2,Hund

    Y:
    1,1,schläft,11.11.2008 10:23:00
    2,2,wach,11.11.2008 14:23:00
    3,1,wach,12.11.2008 01:11:00
    4,1,schläft,12.11.2008 05:00:00

    Bei einer Abfrage mit DATUM 11.11.2008 18:00:00 soll folgendes Ergebnis erscheinen:

    1,Affe,schläft
    2,Hund,wach

    Bei einer Abfrage mit DATUM 12.11.2008 04:59:00 soll folgendes Ergebnis erscheinen:

    1,Affe,wach
    2,Hund,wach

    dieses Standardproblem kannst Du mit einer korrelierten Unterabfrage (ab MySQL 4.1) lösen, siehe z.B. dieses Archivposting. Wie im zweiten Beispiel musst Du im Subselect die WHERE-Klausel mit Deiner Datums-/Zeit-Bedingung erweitern.

    Freundliche Grüße

    Vinzenz

    1. Hallo,
      danke für die schnelle Antwort.
      Arbeite derzeit auf einem MYSQL 5er System, jedoch wird das Produktive irgendwas um die 4.6 oder so sein.

      Hier meine SQL-Abfrage:

      SELECT p.ID , q.WERT , max( DATE )
      FROM X p
      JOIN Y q ON q.X_ID = p.ID
      GROUP BY q.X_ID
      ORDER BY p.ID

      Das Ergebnis sieht schon ganz gut aus, allerdings passt die Ausgabe von WERT nicht mit dem DATE zusammen. Also ich bekomme jetzt richtige ID und richtiges DATE, aber WERT ist noch falsch.

      Bekommt man das ohne SUB Abfrage hin?

      Grüße

      1. Hallo,

        Hier meine SQL-Abfrage:

        SELECT p.ID , q.WERT , max( DATE )
        FROM X p
        JOIN Y q ON q.X_ID = p.ID
        GROUP BY q.X_ID
        ORDER BY p.ID

        ja, das ist das typische MySQL-GROUP-BY-Problem. Jedes Datenbankmanagementsystem, das ich kenne, weist diese Anweisung als syntaktisch falsch zurück - außer MySQL.

        Das Ergebnis sieht schon ganz gut aus, allerdings passt die Ausgabe von WERT nicht mit dem DATE zusammen. Also ich bekomme jetzt richtige ID und richtiges DATE, aber WERT ist noch falsch.

        Verständlich bei einer falschen Anweisung.

        Bekommt man das ohne SUB Abfrage hin?

        Es gibt zwar extrem schmutzige Tricks, das ohne Subselect hinzubekommen, aber die korrekte Lösung heißt hier: korrelierte Unterabfrage.

        Freundliche Grüße

        Vinzenz

        1. Vielen Dank für die nette Hilfe :-)

          Dann werd ich mich für die korrekte Lösung entscheiden :D

          1. Hier meine ?fertig? Abfrage:

            SELECT p.id,q.wert,q.date FROM x p
            JOIN y q
            ON q.x_id=p.id && q.date = (SELECT MAX(k.date) FROM y k WHERE k.x_id=p.id && date < 'WUNSCHDATE')
            ORDER BY p.id

            kann man das noch optimieren. Also dieser Doppelverlgiech x_id=id ist mir noch so ein Dorn im Auge bei dem ich Optimierungsmöglichkeiten vermute?

            Grüße