2013-03-10 12 views
8

Mam jedną tabelę z pewnymi statystykami na datę, które chcę wylistować z MySQL. Dla niektórych terminach nie będzie statystyka, więc wynik powinien wyglądać mniej więcej tak:
01.03.2013: 3
2.03.2013: 2
03.03.2013: 0
2013-03 -04: 1MySQL LEFT JOIN z GROUP BY i WHERE IN (sub zapytanie)

Pomyślałem, że wypełnienie luk przez 0-zero może zostać rozwiązane przez osobną tabelę ze wszystkimi możliwymi datami i LEWYM DOŁĄCZEM. Jak na razie dobrze.

statystyk (wyświetlenia) znajduje się w tabeli „campaigndata”:

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

Ale chcę dostać tylko niektóre statystyki. Mówiąc dokładniej, chcę tylko wierszy z "campaigndata", gdzie "campaignid" znajduje się w tabeli "filterfilter" z "campaigntype" ustawionym na 1 (jako przykład).

To jest stół 'campaignfilter':

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

Ktoś ma pojęcia, w jaki sposób można to zrobić?

PS: Struktura tabeli "campaigndata" jest prawie zablokowana, ponieważ opiera się na automatycznym importowaniu z zewnętrznego systemu.


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'); 

pożądanego rezultatu

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

Odpowiedz

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 

Aby dodatkowo zdobyć więcej wiedzy o przyłącza, prosimy odwiedzić poniższy 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

przykro mi, że nie wydają się działać. Chcę SUMA (a.impressions), a nie COUNT (b.campaignid). – sylling

+0

Czy możesz podać przykładowe rekordy z pożądanym wynikiem? –

+0

Żądany wynik i przykładowe zapisy: http://pastie.org/6440022 – sylling