2013-03-10 3 views
8

Ich habe eine Tabelle mit einigen Statistiken pro Datum, die ich mit MySQL aufgelistet werden soll. Für einige Tage, wird es keine Statistiken sein, so dass das Ergebnis wie folgt aussehen sollte:
2013.03.01: 3
2013.03.02: 2
2013.03.03: 0
2013-03 -04: 1MySQL LEFT JOIN mit GROUP BY und WHERE IN (Unterabfrage)

Ich fand heraus, dass das Füllen der Lücken mit 0 -zero mit einer separaten Tabelle mit allen möglichen Daten und LEFT JOIN gelöst werden konnte. So weit, ist es gut.

Die Statistiken (Impressionen) ist in der Tabelle 'campaigndata':

id - int(11) 
date - date 
campaignid - int(11) 
impressions - int(11)

Aber ich will nur einige der Statistiken erhalten. Um genauer zu sein, ich möchte nur die Zeilen von 'campaigndata', wo 'campaignid' in der Tabelle 'campaignfilter' ist und 'campaignntype' auf 1 gesetzt ist (als Beispiel).

Das ist der Tisch 'campaignfilter':

id - int(11) 
campaigntype - int(11) 
campaignid - int(11)

Wer Ahnung, wie dies geschehen könnte?

PS: Die Struktur der Tabelle 'campaigndata' ist weitgehend gesperrt, da sie auf einem automatischen Import von einem externen System basiert.


SAMPLE RECORDS

CREATE TABLE demo_campaigndata (
    id int(11) NOT NULL AUTO_INCREMENT, 
    date date NOT NULL, 
    campaignid int(11) NOT NULL, 
    impressions int(11) NOT NULL, 
    PRIMARY KEY (id) 
); 
INSERT INTO demo_campaigndata (id, date, campaignid, impressions) VALUES 
(1, '2013-03-03', 1, 100), 
(2, '2013-03-03', 2, 100), 
(3, '2013-03-03', 3, 100), 
(4, '2013-03-04', 2, 100), 
(5, '2013-03-05', 1, 100), 
(6, '2013-03-05', 2, 100); 


CREATE TABLE demo_campaignfilter (
    id int(11) NOT NULL AUTO_INCREMENT, 
    campaigntype int(11) NOT NULL, 
    campaignid int(11) NOT NULL, 
    PRIMARY KEY (id) 
); 
INSERT INTO demo_campaignfilter (id, campaigntype, campaignid) VALUES 
(1, 1, 1), 
(2, 1, 3); 


CREATE TABLE demo_calendar (
    date date NOT NULL, 
    PRIMARY KEY (date) 
); 
INSERT INTO demo_calendar (date) VALUES 
('2013-03-01'), 
('2013-03-02'), 
('2013-03-03'), 
('2013-03-04'), 
('2013-03-05'); 

Gewünschtes Ergebnis

2013-03-01: 0 
2013-03-02: 0 
2013-03-03: 200 
2013-03-04: 0 
2013-03-05: 100 

Antwort

9
SELECT a.date, COUNT(b.campaignid) totalStat 
FROM campaigndata a 
     LEFT JOIN campaignfilter b 
      ON a.campaignid = b.campaignid AND 
       b.campaigntype = 1 
GROUP BY a.date 

weiter, um mehr Wissen zu erlangen über beitritt, bitte besuchen Sie den folgenden Link:

UPDATE 1

SELECT a.date, 
     COALESCE(b.totals,0) totals 
FROM demo_calendar a 
     LEFT JOIN 
     (
      SELECT a.date, SUM(impressions) totals 
      FROM demo_campaigndata a 
        INNER JOIN demo_campaignfilter b 
         ON a.campaignid = b.campaignid 
      WHERE b.campaigntype = 1 
      GROUP BY a.date 
     ) b ON a.date = b.date 
+0

Es tut mir Leid, das scheint nicht zu funktionieren. Ich möchte SUM (a.impressions), nicht COUNT (b.campaignid). – sylling

+0

können Sie Beispieldatensätze mit dem gewünschten Ergebnis geben? –

+0

Gewünschtes Ergebnis und Beispieldatensätze: http://pastie.org/6440022 – sylling