【问题标题】:Mysql select count per category per dayMysql每天选择每个类别的计数
【发布时间】:2013-12-31 19:06:25
【问题描述】:

我有三张桌子。

categories

标识 |名字

items

标识 |姓名 | category_id

orders

标识 | item_id |日期时间 |交易代码

现在如何在我的查询中为每个类别的每一天选择具有特定交易代码的总订单。

期望的结果:

Date        Category Total
2013-12-01  001      6
2013-12-01  002      0
2013-12-01  003      1
2013-12-02  001      14
2013-12-02  002      2
2013-12-02  003      0
2013-12-03  001      11
2013-12-03  002      4
2013-12-03  003      4

编写此查询的最有效方法是什么。

这是我迄今为止尝试过的:

SELECT DATE(od.trans_date) AS Date, ct.number AS Category, COUNT(od.id) AS Total 
from orders od
JOIN items im ON od.item_id = im.id
JOIN categories ct ON im.category_id = ct.id
WHERE od.trans_date BETWEEN '2013-12-01 00:00:00' AND '2013-12-03 23:59:59'
AND (od.transaction_code = 17 OR od.transaction_code = 15)
GROUP BY DATE(od.trans_date), ct.number ASC;

谢谢

【问题讨论】:

  • 您的结果关闭???怎么会???
  • 我知道我有一些类别的订单为零,但我没有得到一个零
  • 如果他们没有订单,那么他们就没有transaction_date,所以他们不满足你的where条件。您可能需要切换加入的方向。

标签: mysql sql


【解决方案1】:

我建议将您的 JOINS 更改为 LEFT JOINS,以便您的结果将包括没有任何商品的订单...

SELECT DATE(od.trans_date) AS Date, ct.number AS Category, COUNT(od.id) AS Total 
from orders od
LEFT JOIN items im ON od.item_id = im.id
LEFT JOIN categories ct ON im.category_id = ct.id
WHERE od.trans_date BETWEEN '2013-12-01 00:00:00' AND '2013-12-03 23:59:59'
AND (od.transaction_code = 17 OR tr.transaction_code = 15)
GROUP BY DATE(od.trans_date), ct.number ASC;

此外,您可能需要切换JOINS 的顺序,以便显示所有类别,而不是所有订单。

SELECT DATE(od.trans_date) AS Date, ct.number AS Category, COUNT(od.id) AS Total 
FROM categories ct
LEFT JOIN items im ON ct.id = im.category_id
LEFT JOIN orders od ON im.id = od.item_id
WHERE od.trans_date BETWEEN '2013-12-01 00:00:00' AND '2013-12-03 23:59:59'
AND (od.transaction_code = 17 OR tr.transaction_code = 15)
GROUP BY DATE(od.trans_date), ct.number ASC;

【讨论】:

  • 这仅显示当天至少有 1 个订单的类别。对于在 date1 和 date2 之间至少有一个订单的每个类别,我每天都需要计数。
  • 如果您需要每天的结果,那么您应该使用顶部查询,基本上是您SELECTFROM 的任何表,它将包含该表中的所有记录,LEFT JOIN's从有匹配的那些表中添加结果...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多