Spike Geschrieben 4. November 2009 Teilen Geschrieben 4. November 2009 Ich steh auffem Schlauch. Ich möchte ein einziges, großes Resultset erhalten und mir damit jede Menge Einzel-Selects ersparen. Es geht (wie sollte es auch sein) um eine Statistikansicht. -> mySQL 5.0.45 und PHP 5.2.3. Ich habe 2 Tabellen, welche verkürzt aufs wesentliche so aussehen: Produkte - id - bezeichnung Angebote - produkt_id - datum In Angebote werden also alle Angebote gespeichert, die für Produkt XY rausgegeben wurden. "produkt_id" ist dabei die Verknüpfung ... gab es 4 Angebote zu Produkt XY, stehen da 4 Datensätze drin. Nun möchte ich folgendes Ergebnis erhalten: Produktbezeichnung | Anzahl Angebote Gesamt | Anzahl Angebote der letzten 30 Tage Ich könnte mir einfach alle Produkte holen und dann in PHP mit einer Schleife das Result durchlaufen und für jedes Produkt die jeweilige Countabfrage durchführen. Allerdings wollte ich nicht tausend Selects abfeuern ... deshalb frage ich mich, ob das nicht auch in einer einzigen Anweisung möglich ist? Die Statistikspalten sollten dabei auch anwachsen können ... (z. B. die letzten 3 Monate, die letzten 365 Tage usw). Was bereits funktioniert ist folgendes: SELECT a.id, a.bezeichnung, count(b.produkt_id) as anzahlgesamt FROM produkte as a,angebote as b WHERE b.produkt_id = a.id GROUP BY a.bezeichnung ORDER BY a.bezeichnung ASC [/PHP] Da gibt er hinter jedem Produkt die Gesamtzahl an Angeboten aus. Nun möchte ich aber auch eine weitere Statistikspalte haben, die Anzahl an Angeboten der letzten 30 Tage, also nochmal ein Count, mit anderer WHERE Bedingung, welche zusätzlich über das Datum geht. Also: [PHP]SELECT a.id, a.bezeichnung, count( b.produkt_id ) AS anzahl30tage FROM produkte AS a, angebote AS b WHERE b.produkt_id = a.id AND b.datum > '2009-10-05' GROUP BY a.bezeichnung ORDER BY a.bezeichnung ASC Getrennt jede Abfrage für sich funktioniert wunderbar. Nur wie bekomme ich die zusammen? UNION ist wohl der falsche Ansatz ... da tauchen beide Abfragen im selben Resultset untereinander auf. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
robotto7831a Geschrieben 4. November 2009 Teilen Geschrieben 4. November 2009 Hallo, die erste Idee ist, obwohl ich noch nicht ganz davon überzeugt bin: SELECT a.id, a.bezeichnung, count(b.produkt_id) as anzahlgesamt, (der andere select) as anzahl30tage FROM produkte as a,angebote as b WHERE b.produkt_id = a.id GROUP BY a.bezeichnung ORDER BY a.bezeichnung ASC [/php] Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
T3D Geschrieben 4. November 2009 Teilen Geschrieben 4. November 2009 Das ganze kannst du anhand eines IF`s und summe loesen SELECT a.id, a.bezeichnung, count(b.produkt_id) as anzahlgesamt, SUM( IF(b.datum > '2009-10-05' , 1 , 0) ) AS anzahl30tage FROM produkte as a, angebote as b WHERE b.produkt_id = a.id GROUP BY a.bezeichnung ORDER BY a.bezeichnung ASC [/PHP] hoffe is kein syntaxfehler drin habs naemlich ned probiert Ted Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
streffin Geschrieben 4. November 2009 Teilen Geschrieben 4. November 2009 (bearbeitet) Ganz allgemein lässt sich sowas mit unterabfragen lösen. SELECT angebote_gesammt.id, angebote_gesammt.bezeichnung, angebote_gesammt.anzahlgesamt, angebote_30tage.anzahl30tage FROM ( SELECT a.id, a.bezeichnung count(b.*) as anzahlgesamt, FROM produkte as a INNER JOIN angebote as b ON a.id = b.produkt_id GROUP BY a.id ) as angebote_gesammt LEFT JOIN ( SELECT a.id, ifnull(count(b.*) ,0) AS anzahl30tage FROM produkte as a INNER JOIN angebote as b ON a.id = b.produkt_id WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) GROUP BY a.id ) as angebote_30tage ON angebote_gesammt.id = angebote_30tage.id Ist jetzt ungetestet, sollte aber wenn mich nich alles täuscht passen (ich hat n langen tag) Wenn du das jetzt erweitern willst um "Anzahl Angebote der letzten 60 Tage" dann machste da einfach ne neue unterabfrage, joinst wieder über die id, und fügst die Spalte dem äusseren SELECT hinzu Gruß Sven Bearbeitet 4. November 2009 von streffin Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Spike Geschrieben 5. November 2009 Autor Teilen Geschrieben 5. November 2009 Unterabfragen sind ne Lösung, aber nicht so gut wartbar ... bei der Menge an Statistiken die ich ausgeben möchte. Das ganze kannst du anhand eines IF`s und summe loesen Das ist genau die elegante Lösung, die ich brauche. Danke! Einfach ne Zeile ergänzen und mit if das Datum abfragen ... schön übersichtlich. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
streffin Geschrieben 5. November 2009 Teilen Geschrieben 5. November 2009 Wie gesagt, ganz allgemein. In so nem simplen Fall wie nur nach datum eingrenzen ist ne if natürlich weit kürzer und übersichtlicher. Mit Unterabfragen bist du aber weit flexibler und kannst wirklich alles mit machen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.