Zum Inhalt springen

mySQL mehrere COUNT mit eigenem WHERE


Spike

Empfohlene Beiträge

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von streffin
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...