构建一个 SQL 来计算与父级相关的行数
Posted
技术标签:
【中文标题】构建一个 SQL 来计算与父级相关的行数【英文标题】:Building a SQL to calculate the number of rows relating to the parent 【发布时间】:2011-10-03 23:10:12 【问题描述】:我发现很难在以下数据库架构上构建 SQL,
商店
身份证 名字
订单
身份证 shop_id 日期 金额
您可以看到一个商店可以有很多订单。 我想构建一个 SQL 来给出每个商店在特定日期的订单数量。 所以 WHERE 部分必须是(例如 2011-7-13),
WHERE order.date = '2011-7-13'
我想不出 SELECT 部分应该是什么样子。我认为应该使用 COUNT(*),但这就是我现在脑子里的全部内容。
有人可以提供一些提示吗?
非常感谢大家。
【问题讨论】:
建议 - 避免在表/列名中使用 SQL 保留字,即使您的 DBMS 允许这样做,也是为了避免将来混淆。 【参考方案1】:试试这个:
SELECT COUNT(Order.id), Shop.name, Order.date
FROM Shop INNER JOIN Order ON Shop.id=Order.shop_id
WHERE Order.date = '$date'
GROUP BY Shop.name, Order.date
ORDER BY Order.date
我已在结果中包含日期以供验证。
【讨论】:
按名称分组,当您有一个非常好的id
列可供使用(这可能更短,并且应该被索引)?
名称是人类可读的...为什么您只想查询 id?顺便说一句,在我的之后发布的另外两个答案似乎同意...
嗯,真的,并没有真正考虑过那部分......而且做一个卷起的表格参考可能不是非常有效。我想我已经习惯了让 CTE 来做这种工作。【参考方案2】:
试试这个:
SELECT a.id, a.name, COUNT(1) AS order_count
FROM Shop a INNER JOIN Order b
ON a.id = b.shop_id
WHERE `date` = '2011-7-13'
GROUP BY a.id, a.name
【讨论】:
【参考方案3】:SELECT Shop.name, COUNT(*) AS Num_Orders
FROM Shop JOIN `Order` ON Shop.id = `Order`.id
WHERE DATE(`Order`.`date`) = '2011-7-13'
GROUP BY `Order`.id;
注意,如果date
是DATETIME
列,我使用DATE()
函数只返回其中的日期部分,而不是时间。
您可能必须如上所述在反引号中引用date
和Order
,因为它们是保留的mysql 关键字。也许不是date
,但几乎可以肯定是Order
。
【讨论】:
【参考方案4】:经过一番考虑(以及@AJ 的当之无愧的评论),这是我的(修改后的)答案。
SELECT shop.id, shop.name,
FROM shop
JOIN (SELECT shop_id, date, COUNT(*)
FROM order
WHERE date = :date
GROUP BY shop_id, date) as order_count
ON order_count.shop_id = shop.id
如果您想要按日期列出所有订单计数,请删除内部 WHERE
子句。
【讨论】:
以上是关于构建一个 SQL 来计算与父级相关的行数的主要内容,如果未能解决你的问题,请参考以下文章