Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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.

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

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

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

  • Autor

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.

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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.