René Maroufi: ziemlich komplizierte SELECT-Abfrage

Hallo,

ich habe eine MySQL DB die hat unter anderen die Tabellen rechnungen und kunden. Nun will ich eine Abfrage über beide Tabellen machen, bei der aber nur Datensätze berücksichtigt werden, wenn die letzte Rechnung älter als 3 Monate her ist. Ich muß dazu sagen, das ich als datum kein MySQL datum sondern UNIX-Timestamps aus PHP heraus benutze. Primärschlüßel von Tabelle kunden ist id (ein AUTO_INCREMENT Wert als Kundennummer). Dies wird als Fremdschlüßel im Feld kunde in der Tabelle rechnungen verwendet. Eine abfrage auf Daten mit einer Rechnung älter als 3 Monate bekomme ich hin, aber nicht die letzte Rechnung älter als 3 Monate (Die Tabelle rechnungen enthält schließlich zu einem Kunden womöglich mehrere Rechnungen). Ich habe z. B. folgendes versucht:

SELECT r.datum,r.kunde,k.anrede,k.vorname,k.nachname,k.strasse,k.hausnr,k.plz,k.ort,k.email FROM rechnungen r,kunden k WHERE (k.id=r.kunde) AND (r.datum<'$mon3') HAVING MAX(r.datum)

Das geht aber nicht. Wie muß ich das machen?

Danke schon mal und Gruß
René

  1. Having kommt glaube ich nur nach nem group by
    und was soll das bewirken in deiner abfrage???
    (k.id=r.kunde)
    da nimm ma die klammern weg.

    hm gibts bestimmt ne lustige sql funktion für um rauszubekommen welche rechnungen älter als 3 monate sind die kenne ich aber nicht.

    1. Was geht denn nicht ???
      startet er die abfrage nicht oder werden falsche werte ausgegeben ??

      1. Was geht denn nicht ???
        startet er die abfrage nicht oder werden falsche werte ausgegeben ??

        Es kommen keine Werte raus, obwohl ich extra testweise Daten eingefügt habe die als Ergebnis rauskommen müßten.

        Gruß
        René

    2. Having kommt glaube ich nur nach nem group by
      und was soll das bewirken in deiner abfrage???
      (k.id=r.kunde)

      Das ist der Bezug Primärschlüßel, Fremdschlüßel um beide Tabellen zu verknüpfen.

      Gruß
      René

  2. Hallo

    ich habe eine MySQL DB die hat unter anderen die Tabellen rechnungen und kunden. Nun will ich eine Abfrage über beide Tabellen machen, bei der aber nur Datensätze berücksichtigt werden, wenn die letzte Rechnung älter als 3 Monate her ist. ... Ich habe z. B. folgendes versucht:

    SELECT r.datum,r.kunde,k.anrede,k.vorname,k.nachname,k.strasse,k.hausnr,k.plz,k.ort,k.email FROM rechnungen r,kunden k WHERE (k.id=r.kunde) AND (r.datum<'$mon3') HAVING MAX(r.datum)
    Das geht aber nicht. Wie muß ich das machen?

    Das kann nicht gehen. Wenn Du in _einem_ Feld eine Aggregatsfunktion verwendest, so musst _Du_ dies in _allen_ Feldern Deiner Abfrage tun, ausser bei den Feldern, die in der HAVING-Klausel auftauchen.

    Ich persönlich bevorzuge für den JOIN die JOIN-Klausel ;-)

    MySQL verlangt nicht die vielen, vielen unsinnigen Klammern von MS Access :-)

    Soweit ich das verstanden habe, würdest Du für Dein Problem SUBSELECTS benötigen - beachte bitte den Irrealis - aber SUBSELECTS sind in MySQL v3.23.xx noch nicht enthalten.

    D.h. Du solltest Deine Idee von gestern durchaus realisieren.
    1. Abfrage ermittelt die Kunden-IDs (das kriegst Du hin)
    2. Abfrage nutzt das Ergebnis der 1. Abfrage in WHERE k.id IN (...)
       also als Ersatz für ...

    Näheres entnimm bitte der MySQL-Dokumentation.

    Gruss,

    Vinzenz

    --
    Die FAQ </faq/> des Forums sind lesenswert und hilfreich.
    1. » 1. Abfrage ermittelt die Kunden-IDs (das kriegst Du hin)

      1. Abfrage nutzt das Ergebnis der 1. Abfrage in WHERE k.id IN

      Danke!

      Gruß
      René

  3. Hallo

    Bastle zwar noch nichtlange mit den mysql-Funktionen rum, so etwas wie folgt sollte es aber denke ich klappen:
    SELECT r.datum,r.kunde,k.anrede,k.vorname,k.nachname,k.strasse,k.hausnr,k.plz,k.ort,k.email FROM rechnungen r,kunden k WHERE (k.id=r.kunde) AND (TO_DAYS(NOW()) - TO_DAYS(MAX(r.datum)) >= 30)

    Grüße aus Würzburg
    Julian