Jonas: Mal wieder - Abfrage einer Datenbank Probleme mit Summe

Hallo,
"arbeite" (eigentlich sollte ich sagen versuche zu arbeiten...) mit PHP und MySql und hab mal wieder eine Frage zur Datenbank abfrage.
Habe u.a. folgende Tabellen:
Bestellung:
id | Datum | Adresse | etc.
Produkt:
id | Name | Beschreibung | etc.
produkt_bestellung:
id | produkt_id | bestellung_id | produkt_anzahl (Menge des bestellten Produkts pro Bestellung)

Nun möchte ich die Produkte ausgegeben haben, die in den letzten vier Wochen bestellt wurde, sortiert nach Menge des jeweiligen Produkts (also Produkt a wurde 200 mal bestellt, Produkt b 150 mal, etc. etc.)
Habe aber keine Schimmer wie ich das machen soll.
Mein letzter Versuch sah so aus:

SELECT
sum(pb.produkt_anzahl) as summe, p.Name
FROM
Bestellung b, Produkt p, produkt_bestellung pb
WHERE
p.id=pb.produkt_id and b.id=pb.bestellung_id and (b.Datum>=(DATE_SUB(CURDATE(),INTERVAL 1 MONTH)))
GROUP BY
p.id
ORDER BY
summe

Wäre super wenn Ihr mir helfen könntet (bin allerdings erst morgen wieder online...)

Danke
Jonas

  1. yo,

    Wäre super wenn Ihr mir helfen könntet (bin allerdings erst morgen wieder online...)

    mal davon abgesehen, dass es besser wäre, über die p.id und den p.name zu gruppieren und das implizierte JOINS sehr unschön zu lesen sind, was genau ging den bei deinen letzten versuch nicht ?

    Ilja

    1. Hi Ilja,
      danke für den Hinweis.
      Da war tatsächlich ein anderer Fehler in der Abfrage die etwas ausführlicher ausfällt als gepostet, aber mit der Summe nichts zu tun hatte, und ohne Summe getestet war und lief - daher bin ich davon ausgegangen, daß das Problem bei der Summenabfrage liegen müßte. Habe wohl bei der Zusammenführung der beiden Abfragen einen Fehler gemacht.... sorry für's posting...

      Aber wieso wäre es besser über p.id und p.name zu gruppieren? ID ist doch eindeutig und da sollte es doch langen über die ID zu gruppieren, oder?
      Und was meinst Du mit implizierte Joins?

      Grüße,
      Jonas

      1. yo,

        Aber wieso wäre es besser über p.id und p.name zu gruppieren? ID ist doch eindeutig und da sollte es doch langen über die ID zu gruppieren, oder?

        jedes andere dbms ausser mysql würde dir eine fehlermeldung für deine abfrage ausgeben. alle spalten, die du ausgeben willst, müssen in der group by klausel stehen oder aber eine aggregat-funktionen sein.

        mysql hat aus performance gründen einen eigenen weg eingeschlagen und du benutzt auch im sinne von mysql deine abfrage richtig. aber das ganze richtet mehr schaden an, als es hilft. ob der name nun durch die gruppierung über die id eindeutig ist, das weisst du, aber nicht das dbms. würdes es das überprüfen, wäre ja der geschwindigkeitsvorteil wieder dahin. also erlaubt mysql das ausgeben aller spalten, egal ob sie nun eindeutig in einer grupperierung sind oder nicht, es nimmt halt einen zufälligen wert und hofft, das der schon eindeutig sein wird. das ergebnis ist, hier gibt es unzählige beiträge, die sich nur mit dieser problematik beschäftigen, weil es zu "komischen" ergebnissen kommt, wenn es eben nicht eindeutig ist.

        Und was meinst Du mit implizierte Joins?

        alle relevaten dbms beherschen die expliziete schreibweise von joins. impliziet heisst, du schreibst die jeweiligen tabellen in die FROM klausel mit kommas getrennt und die join bedongungen in die where klausel. das ist aber nur schwer zu lesen, weil ich dann mühsam rauslesen muss, welche join bedingung welche tabellen verbindet.

        bei der explizieten schreibweise treeene ich die tabellen sauber voneinander und haben auch gleich die jeweilige join bedingung getrennt von den anderen bedinungen in der where klausel.

        SELECT ....
        FROM tab1
        INNER JOIN tab2 ON tab2.id = tab2.fremdschlüssel
        WHERE hier_andere_bedingungen
        AND ....

        Ilja