2012-03-22 41 views
3

我正在制作一些条形图来计算日,月,年的物品销售量。我遇到的问题是我的简单MySQL查询只返回有数值计数的计数。它不会奇迹般地填写日期不存在的日期和物品销售量= 0。例如,当试图填充表格时,这会导致我出现问题,因为某一年中的所有星期都没有出现,只有出售物品的那几个星期才出现。是当给定日期增量的计数为0时,如何处理在MySQL中按日期计算项目?

我的表和字段如下:

items table: account_id and item_id 
// table keeping track of owners' items 
items_purchased table: purchaser_account_id, item_id, purchase_date 
// table keeping track of purchases by other users 
calendar table: datefield 
//table with all the dates incremented every day for many years 

这里的第一个查询我指的是上面:

SELECT COUNT(*) as item_sales, DATE(purchase_date) as date 
FROM items_purchased join items on items_purchased.item_id=items.item_id 
where items.account_id=125 
GROUP BY DATE(purchase_date) 

我读过,我应该加入日历表与表计数发生的地方。我已经做了,但现在我不能得到第一个查询发挥好这个第二次查询,因为在第一次查询的连接从查询结果,其中项目销售0

这里这就需要第二次查询消除日期与第一个查询合并莫名其妙地产生我正在寻找的结果:

SELECT calendar.datefield AS date, IFNULL(SUM(purchaseyesno),0) AS item_sales 
FROM items_purchased join items on items_purchased.item_id=items.item_id 
RIGHT JOIN calendar ON (DATE(items_purchased.purchase_date) = calendar.datefield) 
WHERE (calendar.datefield BETWEEN (SELECT MIN(DATE(purchase_date)) 
FROM items_purchased) AND (SELECT MAX(DATE(purchase_date)) FROM items_purchased)) 
GROUP BY date 
// this lists the sales/day 
// to make it per week, change the group by to this: GROUP BY week(date) 

这第二查询的失败在于它不account_id算item_sales(人试图将项目出售给purchaser_account_id用户)。第一个查询确实存在,但它没有销售项目= 0的所有日期。所以是的,令人沮丧。

以下是我想要得到的数据看(注:这是什么ACCOUNT_ID = 125已售出,其他的人很多都在这段时间内不同的号码):

2012-01-01  1 
2012-01-08  1 
2012-01-15  0 
2012-01-22  2 
2012-01-29  0 

这里是一号询问目前看起来像:

2012-01-01  1 
2012-01-08  1 
2012-01-22  2 

如果有人可以提供一些建议,我将非常感激。

+0

如何在group by子句中添加account_id? – 2012-03-22 00:34:54

+1

你是什么意思“,由'account_id'选择'item_sales'?如果你在添加什么'那里items.account_id = 125'从第一个查询,为喜,如果'where'在第二次的查询条件? – 2012-03-22 00:36:22

+0

化妆一个'和'到那个'where',那么结果仅限于'account_id = 125'存在的日期,即所有的0个销售日期都被丢失了,dangit! – 2012-03-22 00:39:34

回答

1

我不太清楚关于您遇到的问题,因为我不知道它们包含的实际表格和数据会生成这些结果(这会有很大的帮助!)。但是,让我们尝试一下。使用此条件:

where (items.account_id = 125 or items.account_id is null) and (other-conditions) 
+0

嗨,Mosty,请参阅上面更新的问题。我现在更详细地描述了表格,期望的结果等,谢谢! – 2012-03-22 01:51:22

+1

您好Mosty,我仍在调查,但我认为你的建议,包括或条款完美的作品!真棒!只是给我更多的时间来调查(我的桌子在现实中相当混乱),我可能会接受答案今晚晚些时候左右, – 2012-03-22 02:05:58

+0

当然,请花时间:) – 2012-03-22 02:56:46

0

你的第一个查询是完全可以接受的。事实是你没有mysql表中的数据,因此它不能将任何数据分组在一起。这可以。您可以在代码中对此进行解释,以便如果日期不存在,那么显然没有要绘制的数据。您可以通过订购日期值来更好地解决此问题,因此您可以相应地循环查找并查找错过的日期。

此外,为避免做DATE()函数,则可以通过更改组到GROUP BY日期(因为你在你的领域中选择DATE(pruchase_date)的日期)

+0

您好泰勒,你是否意味着循环寻找使用像PHP这样的脚本语言(这就是我使用服务器端)的缺失日子?或者有没有办法在MySQL中循环?无论哪种方式,你介意分享一些代码来进一步解释一下吗?谢谢! – 2012-03-22 00:43:02