mysql - SUM Union All 作为 select 语句上的子查询

标签 mysql

我有三个表:测验评论问题。 它们都有一个名为 activityIDactivity 外键。

我想在单个查询中对每个表上的条目数量进行求和,为所有事件返回相应的总和

这是我的尝试:

SELECT
    `activity`.`id` AS `activityID`,
    `activity`.`name`,
    (SELECT SUM(`count`) FROM (
        SELECT COUNT(*) AS `count`
        FROM `quiz` WHERE `quiz`.`activityID` = `activity`.`id`

        UNION ALL

        SELECT COUNT(*) AS `count`
        FROM `comment` WHERE `comment`.`activityID` = `activity`.`id`

        UNION ALL

        SELECT COUNT(*) AS `count`
        FROM `question` WHERE `question`.`activityID` = `activity`.`id`
    ) `union`) AS `interactions`
FROM
    `activity`
WHERE 1
    AND `activity`.`eventID` = 1234
GROUP BY `activity`.`id`
ORDER BY `interactions` DESC

它不起作用,因为在嵌套子查询中找不到activity.id。是否可以将此值添加到嵌套子查询范围?或者甚至更好,是否有一种更简单的方法来执行此操作,而无需运行三个单独的子查询并添加它们?

这是我迄今为止最好的解决方案(不使用UNION):

SELECT
    `activity`.`id` AS `activityID`,
    `activity`.`name`,
    ( SELECT COUNT(*) AS `count`
      FROM `quiz` WHERE `quiz`.`activityID` = `activity`.`id` ) +
    ( SELECT COUNT(*) AS `count`
      FROM `comment` WHERE `comment`.`activityID` = `activity`.`id` ) +
    ( SELECT COUNT(*) AS `count`
      FROM `question` WHERE `question`.`activityID` = `activity`.`id` ) AS `interactions`
FROM
    `activity`
WHERE 1
    AND `activity`.`eventID` = 1234
GROUP BY `activity`.`id`
ORDER BY `interactions` DESC

谢谢。

最佳答案

您可以连接所有表并获取计数。

SELECT
    `activity`.`id` AS `activityID`,
    `activity`.`name`,
    SUM(I.count) as interactions
FROM
    `activity` A INNER JOIN 
    (SELECT `quiz`.`activityID`, COUNT(*) AS `count`
        FROM `quiz` 
        GROUP BY `quiz`.`activityID`
        UNION ALL
        SELECT `comment`.`activityID`, COUNT(*) AS `count`
        FROM `comment`
        GROUP BY `comment`.`activityID`
        UNION ALL
        SELECT `question`.`activityID`, COUNT(*) AS `count`
        FROM `question`
        GROUP BY `question`.`activityID`
    ) interactioncounts I on A.id = I.activityID
WHERE 1
    AND `activity`.`eventID` = 1234
GROUP BY `activity`.`id`
ORDER BY `interactions` DESC

关于mysql - SUM Union All 作为 select 语句上的子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49390900/

相关文章:

MySQL:合并不适用于具有唯一索引的表

mysql - 旧版 MYSQL 3.x DB - 查询在不应失败时失败

mysql - 如何从一个表中查询另一个表中不可用的数据,假设相同的数据也不应该在同一个表中?

mysql - mysql中添加两个或多个时间数据值

mysql - 配置单元使用 mysql 元存储

php - 如何从 SQL 查询中获取整数输出

mysql - mysql存储过程逻辑有问题

php - 如何在 PHP 中获取 MySQL 表结构?加上所有表的列表?

mysql - 用于插入的 Coldfusion 环

php - imagefttext 从数据库中获取文本