【问题标题】:How to merge multiple queries into a single query in MySQLMySQL如何将多个查询合并为一个查询
【发布时间】:2016-04-02 06:40:03
【问题描述】:

假设我有一个名为“productClick”的表,如下所示:

----id------click-------------ctime----------
|    1  |    5     |   2015-12-26 00:01:12  |
---------------------------------------------
|    2  |    2     |   2015-12-27 00:01:12  |
---------------------------------------------
|    3  |    7     |   2015-12-28 00:01:12  |
---------------------------------------------
|    4  |    1     |   2015-12-28 00:01:12  |
---------------------------------------------

我想获取产品总数、今天添加的产品总数和总点击次数。

我有三个这样的独立查询:

SELECT COUNT(*) as totalProduct FROM productClick
SELECT COUNT(*) as todayTotalProductAdded FROM productClick WHERE DATE(`ctime`) = CURDATE()
SELECT sum(click) as totalClick FROM productClick

它工作正常。但我想将这三个单独的查询组合成一个查询。如何做到这一点?

更新

问题已更新。对不起我的错。谢谢@Gordon Linoff

【问题讨论】:

  • todayClick 真的是COUNT(*) 吗?不应该是SUM(click)吗?

标签: mysql


【解决方案1】:

您可以使用条件聚合:

SELECT COUNT(*) as totalProduct,
       SUM(click) as totalClick,
       SUM(DATE(ctime) = CURDATE()) as todayClick
FROM productClick

todayClick 是以下的简写:

SUM(CASE WHEN DATE(ctime) = CURDATE() THEN 1 ELSE 0 END) as todayClick

或者UNION ALL如果你想要多行:

SELECT 'totalProduct' AS counter_name, COUNT(*) AS counter_value FROM productClick
UNION ALL
SELECT 'todayClick', COUNT(*) FROM productClick WHERE DATE(ctime) = CURDATE()
UNION ALL 
SELECT 'totalClick', SUM(click) FROM productClick

编辑:

今天添加的产品总数和总点击次数。

SELECT COUNT(*) as totalProduct,
       SUM(click) as totalClick,
       SUM(CASE WHEN DATE(ctime) = CURDATE() THEN click ELSE 0 END) as todayClick
FROM productClick

【讨论】:

  • 工作正常。谢谢。但是你能解释一下这行 SUM(DATE(ctime) = CURDATE()) 吗?
  • @AshisBiswas 当DATE(ctime) = CURDATE() 你得到真或假。求和时用 0 表示 false,用 1 表示 true。Demo。最后它只是将 1 和 0 相加。
  • 非常感谢。知道了。 :)
  • 我认为在你的 sql 命令中使用联合会更具可读性。例如,在 sum、count 中使用布尔条件,只有当它为真时才会求和或计数。当 0(零)是“值”时,请考虑 sum 'null'。
  • @CarlosA.Junior 这正是条件聚合的重点。 Null 将被正确处理,就像在每个查询中一样。第一个查询是 COUNT(*) 和 OP 一样,SUM(click) 和 OP 一样,和 todayClick 一样。请参阅我将布尔条件写为速记。如果您需要不同的值或列,请使用完整的CASE WHEN。在多个列上使用 UNION ALL 取决于要求。对于计数器,我喜欢具有多个值的一行,但一如既往地取决于。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多