2012-11-09 34 views
3

我是一個相對的新手,我一直在與此搏鬥太久 - 所以請任何人都可以幫忙!mysql報告每日查詢按類型過濾,包括丟失的分組行

我有一個表接受不同類型開發的查詢(dev_enquiry),我正在創建一個動態圖表來顯示每個開發每天有多少個查詢。我加入了包含日期列的日曆表,以便在沒有查詢時可以得到0個值。

此SQL給我我想要的東西,但其所有的發展

SELECT calendar.datefield AS DATE, COUNT(de_id) AS enquiries 
FROM  `calendar` 
LEFT JOIN dev_enquiry ON DATE(dev_enquiry.de_date_created) = calendar.datefield) 
WHERE  calendar.datefield BETWEEN (
             SELECT MIN(DATE(de_date_created)) 
             FROM dev_enquiry 
            ) 
     AND (SELECT MAX(DATE(de_date_created)) FROM dev_enquiry) 
GROUP BY DATE 
ORDER BY DATE DESC 

2012-11-08  3 
2012-11-07  0 
2012-11-06  2 
2012-11-05  1 
2012-11-04  3 

我想式的發展,以篩選出的結果,但仍保留空值時,有上沒有查詢那個特定的發展日。

以下過濾器的結果,但並沒有給我的空值:

SELECT cal.datefield AS DATE, COUNT(t.de_id) AS enquiries 
    FROM (
SELECT * FROM dev_enquiry as d LEFT JOIN calendar as c ON (DATE(d.de_date_created) = c.datefield) 
WHERE  d.de_dev_name = 'Green') as t 
LEFT JOIN calendar as cal ON (cal.datefield = DATE(t.de_date_created)) 
WHERE (cal.datefield BETWEEN (SELECT MIN(DATE(t.de_date_created)) 
FROM dev_enquiry) AND (SELECT MAX(DATE(de_date_created)) FROM dev_enquiry)) 
GROUP BY DATE ORDER BY DATE DESC 


2012-11-08  1 
2012-11-06  2 
2012-11-05  1 
2012-11-04  1 

結果2012-11-07在這裏失蹤

+1

不錯的第一個問題。歡迎來到堆棧溢出! –

回答

1

也許我誤解了這個問題,爲什麼不在第一個查詢示例的左連接中添加一個AND de_dev_Name = 'Green'

SELECT calendar.datefield AS d, COUNT(dev_enquiry.de_id) AS enquiries 
FROM  calendar 
LEFT JOIN dev_enquiry ON (dev_enquiry.de_date_created = calendar.datefield AND de_dev_name = 'Green') 
WHERE  calendar.datefield BETWEEN 
      (SELECT MIN(DATE(de_date_created)) FROM dev_enquiry) 
     AND (SELECT MAX(DATE(de_date_created)) FROM dev_enquiry) 
GROUP BY d 
ORDER BY d DESC 
+0

輝煌 - 作品一種享受 - 我嘗試過類似的東西,但沒有放在括號內,因此不斷出現錯誤。非常感謝 –

2

訣竅與領導查詢完成日曆表和左側加入不完整(缺少某些日子)彙總表。還請注意IFNULL將(空)結果轉換爲零。

 SELECT cal.datefield AS date, 
      IFNULL(s.enquiries, 0) AS enquiries 
     FROM calendar as cal 
    LEFT JOIN (
      SELECT count(*) enquiries, 
        de_date_created 
      FROM dev_enquiry 
      WHERE de_dev_name = 'Green' 
     GROUP BY de_date_created 
     ) s on s.de_date_created = cal.datefield 
    WHERE cal.datefield 
      BETWEEN (SELECT MIN(de_date_created) FROM dev_enquiry) 
       AND (SELECT MAX(de_date_created) FROM dev_enquiry) 
    ORDER BY datefield DESC 

這是一個SQL小提琴。 http://sqlfiddle.com/#!2/2db68/12/0

+0

嗨Ollie - 感謝您的快速響應和鏈接。 - 它在sqlfiddle鏈接中效果很好,但是當放入我的模式時,它會重複多個日期行而不是添加它們 - 可能是mysql的事情?再次感謝 –