2013-03-10 4 views
8

के साथ MySQL LEFT जॉइन में शामिल हैं मेरे पास प्रति दिन कुछ आंकड़ों के साथ एक तालिका है, जिसे मैं MySQL के साथ सूचीबद्ध करना चाहता हूं। कुछ तिथियों के लिए वहाँ, कोई आंकड़े नहीं पड़ेगा, इसलिए परिणाम कुछ इस तरह दिखना चाहिए:
2013-03-01: 3
2013-03-02: 2
2013-03-03: 0
2013-03 -04: 1ग्रुप बाय और जहां (उप क्वेरी)

मुझे पता चला कि 0 -zero के साथ अंतराल में भरना- सभी संभावित तिथियों और बाएं जॉइन के साथ एक अलग तालिका के साथ हल किया जा सकता है। अब तक सब ठीक है।

आंकड़े (इंप्रेशन) तालिका 'campaigndata' में है:

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

लेकिन मैं केवल आंकड़ों के कुछ प्राप्त करना चाहते हैं। अधिक विशिष्ट होने के लिए, मुझे केवल 'campaigndata' से पंक्तियां चाहिए, जहां 'campaignid' तालिका 'campaignfilter' में 'campaigntype' के साथ सेट 1 (उदाहरण के रूप में) है।

इस तालिका में 'campaignfilter' है:

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

कोई भी सुराग है यह कैसे किया जा सकता है?

पीएस: तालिका 'कैंपिगेंडटा' की संरचना काफी लॉक है, क्योंकि यह बाहरी प्रणाली से स्वचालित आयात पर आधारित है।


नमूना रिकॉर्ड्स

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

वांछित परिणाम

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

उत्तर

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 

आगे और अधिक ज्ञान प्राप्त मिलती है के बारे में, कृपया निम्न लिंक पर जाएं:

0,123,

अद्यतन 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

मैं माफी चाहता हूँ, कि काम करने के लिए प्रतीत नहीं होता। मैं एसयूएम (ए। इंप्रेशन) चाहता हूं, COUNT नहीं (b.campaignid)। – sylling

+0

क्या आप वांछित परिणाम के साथ नमूना रिकॉर्ड दे सकते हैं? –

+0

वांछित परिणाम और नमूना रिकॉर्ड: http://pastie.org/6440022 – sylling

संबंधित मुद्दे