2012-06-28 64 views
2

我想計算總購買次數以及item_id隨時間推移的購買次數。在這個例子中,用戶可以擁有一個物品,這些物品可以由其他用戶購買。業主不能購買他們自己的物品。MYSQL包括具有零項計數的日期的值

我遇到的問題是如何在沒有任何採購與正整數計數一起購買的情況下返回計數爲「0」的結果。

這裏是我的表:

 items   |   items_purchased   | numbers | dates 
i_id item_id user_id | p_id item_id user_id  date | num | datefield 
    1  1  11 | 1  1   13 2009-01-11 | 1  | 2005-06-07 
    2  2  12 | 2  1   14 2009-01-11 | 2  | 2005-06-08 
    3  3  11 | 3  2   15 2009-01-12 | 3  | 2005-06-09 
         | 4  3   16 2009-01-12 | ...  | ... 
         | 5  1   17 2011-12-12 | 1000 | 2015-06-07 

這裏是我的MySQL查詢的user_id=11的項目採購的總數:

SELECT COUNT(*) as counts, DATE(purchase_date) as DATE 
FROM items_purchased 
JOIN items on items_purchased.item_id=items.item_id 
WHERE items.user_id=11 
GROUP BY DATE(purchase_date) 
//note this query **doesn't** make use of the numbers and dates tables b/c I don't know how to use them 

這裏的結果:

counts date 
    2 2009-01-11 
    1 2009-01-12 
    1 2011-12-12 

這裏的我想看看:

counts date 
    2 2009-01-11 
    1 2009-01-12 
    0 2009-01-13 
    0 ... // should be a row here for each day between 2009-01-13 and 2011-12-12 
    1 2011-12-12 
    0 ... // should be a row here for each day between 2011-12-12 and current date 
    0 current date (2012-6-27) 

這是我對商品的總數量限制爲item_id=1這是由user_id=11擁有MySQL查詢:

SELECT COUNT(*) as counts, DATE(purchase_date) as DATE 
FROM items_purchased 
JOIN items on items_purchased.item_id=items.item_id 
WHERE items.user_id=11 and items.item_id=1 
GROUP BY DATE(purchase_date) 

這裏的結果:

counts date 
    2 2009-01-11 
    1 2011-12-12 

上述類似,這裏就是我想看看:

counts date 
    2 2009-01-11 
    0 2009-01-12 
    0 ... // should be a row here for each day between 2009-01-12 and 2011-12-12 
    1 2011-12-12 
    0 ... // should be a row here for each day between 2011-12-12 and current date 
    0 current date (2012-6-27) 

不知怎的,我想我需要納入numbersdates表,但我不知道如何做到這一點。任何想法,將不勝感激,

感謝, 添

+0

可能重複的[從數據庫通過MySQL檢索缺失的日期](http://stackoverflow.com/questions/2978129/retrieve-missing-dates-from-database-via-mysql) – Bohemian

+0

@Bohemian謝謝我見過很多這些示例在SO上,我是絕對的無法理解如何將它們應用於我的查詢。我還在學習MySQL,因此我很難推斷... –

回答

4

編輯的CORRECTING答案:

http://sqlfiddle.com/#!2/ae665/4

SELECT date_format(datefield,'%Y-%m-%d') AS DATE, IFNULL(counts, 0), item_id FROM 
    dates a 
LEFT JOIN 
    (SELECT COUNT(*) as counts, purchase_date,user_id,item_id 
    FROM items_purchased 
    WHERE item_id=1 
    GROUP BY date(purchase_date),item_id)r 
ON date(a.datefield) = date(r.purchase_date) ; 

上面的查詢是基於假設:

  1. 表格日期包含您想要列表的日期範圍內的連續日期。
  2. 不確定什麼是物品表。第二個查詢是按items_purchased表的purchase_date和item_id進行分組。
  3. 計數是要計算在特定日期購買的特定物品(不管user_id)。

由@timpeterson(OP)UPDATE 主要得益於@Sel。這裏的sqlfiddles表明這兩個查詢我感興趣的是:

  1. 購買/天,由單個用戶所擁有的所有物品(例如,user_id=11):用於item_id=1http://sqlfiddle.com/#!2/76c00/3
  2. 購買/天,這是由user_id=11擁有: http://sqlfiddle.com/#!2/76c00/1

這裏是爲第二屆一個的情況下,該鏈接被莫名其妙地打破了SQL代碼:

SELECT date_format(datefield,'%Y-%m-%d') AS DATE, 
IFNULL(countItem, 0), item_id 
FROM dates a 
LEFT JOIN 
(SELECT countItem, purchase_date,i.user_id,p.item_id FROM (
    SELECT count(*) as countItem, purchase_date,user_id,item_id 
    FROM items_purchased 
    GROUP BY date(purchase_date),item_id 
    ) p 
inner join items i 
on i.item_id=p.item_id 
WHERE p.item_id='1' and i.user_id='11' //just get rid of "p.item_id='1'" to produce the 1st query result 
)r 
ON date(a.datefield) = date(r.purchase_date); 
+0

嗨@Sel,謝謝。 2個問題:1)你的意思是說''2009-01-10「'這兩個日期,或者應該是'」10「'和其他''20」'? 2)在哪裏包含'where'語句來捕獲'user_id = 11'?你能否更新你的回答以評論這些?謝謝! –

+0

- @ Sel,我也無法讓你的查詢返回除空行之外的任何東西。 'Purchase_date'是一個'datetime',格式如下,「2007-02-02 20:27:26」。這很重要嗎? –

+0

是的。日期時間確實很重要,因爲第一個查詢返回結果集比如「2007-02-02」。 – sel