构建一个 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;

注意,如果dateDATETIME 列,我使用DATE() 函数只返回其中的日期部分,而不是时间。

您可能必须如上所述在反引号中引用dateOrder,因为它们是保留的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 来计算与父级相关的行数的主要内容,如果未能解决你的问题,请参考以下文章

POI跨行导出excell表格实现.md

SQL 计算表中的行数

计算 SQL 中值转换之间的行数

SQL/Hive 查询以计算特定值每天的行数

计算Sql中的行数

SQL - 计算包含两个不同字段的行数