从另一个表中选择 * 以及计数/总和

Posted

技术标签:

【中文标题】从另一个表中选择 * 以及计数/总和【英文标题】:Select * as well as count/sum from another table 【发布时间】:2015-12-02 06:18:16 【问题描述】:

我正在尝试编写一个 mysql 查询来选择表 a 中的所有行,以及表 b 中的信息,同时还查询另一个表 c 中值的计数和总和,对于 a 的每一行。

我会尝试更好地分解它,这是我的表格的简化版本:

表 A

+---------+----------+-----------+
| id      | name     |      bid  |
+---------+----------+-----------+
| 1       | abc      |         1 |
| 2       | def      |         1 |
| 3       | ghi      |         2 |
+--------------------------------+

表 B

+---------+----------+
| id      | name     |
+---------+----------+
| 1       | STAN     |      
| 2       | UCLA     | 
+--------------------+

表 C

+---------+----------+-----------+
| id      | aid      |   cnumber |
+---------+----------+-----------+
| 1       | 1        |        40 |
| 2       | 1        |        20 |
| 3       | 2        |        10 |
| 4       | 3        |        40 |
| 5       | 3        |        20 |
| 6       | 3        |        10 |
+--------------------------------+

我需要的是一个查询,它将返回包含

的行

a.id | a.name | b.id | b.名称 | SUM(c.cnumber) | COUNT(c.cnumber)

我不确定在 MySQL 中这样的事情是否可行。

我当前的解决方案是尝试查询 A + B Left Join,然后使用 A + C Right Join 查询 UNION。然而,它并没有给我想要的结果。

谢谢。

编辑: 针对这个问题重写了当前查询:

SELECT
 a.id,
 a.name,
 b.id,
 b.name
 "somecolumn" as dummy_column
 "somecolumn1" as dummy_column1
FROM a
LEFT OUTER JOIN b ON a.b.id = b.id
UNION
SELECT
 "somecolumn" as dummy_column
 "somecolumn1" as dummy_column1
 "somecolumn2" as dummy_column2
 "somecolumn3" as dummy_column3
COUNT(c.cnumber) AS ccount
SUM(c.cnumber) AS sum
FROM a
RIGHT OUTER JOIN c ON a.id = c.a.id; 

不幸的是 MySQL 没有 FULL OUTER JOIN,这是我的临时工作,尽管我认为这甚至不是正确的想法。

我想要的输出是表 A 中的所有行以及表 B 中的一些信息,以及它们在表 C 中的总输入。

edit2:

        SELECT
          a.id,
          a.name,
          b.id,
          SUM(c.cnumber) as totalSum,
          (SELECT count(*) FROM c as cc WHERE cc.aid = a.id) as totalCount
        FROM
          a
        LEFT JOIN b ON a.bid = b.id
        LEFT JOIN c ON c.aid = a.id;

对于以后类似的问题,解决办法:

        SELECT
          a.id AS aid,
          a.name,
          b.id,
          (SELECT SUM(c.rating) FROM c WHERE c.aid = aid) AS totalSum,
          (SELECT COUNT(c.rating) FROM c WHERE c.aid = aid) AS totalCount
        FROM
          a
        LEFT JOIN b ON a.bid = b.id;

【问题讨论】:

就像一位老数学老师要求展示你的作品,你的查询是什么样的? 您的测试数据在这里的期望输出是什么? 更新了我的主帖 【参考方案1】:

您的查询应该是:-

SELECT
      a.id,
      a.name,
      b.id,
      (SELECT SUM(c.cnumber) FROM c as cd WHERE cd.aid = a.id) as totalSum,
      (SELECT count(*) FROM c as cc WHERE cc.aid = a.id) as totalCount
    FROM
      a
    LEFT JOIN b ON a.bid = b.id
    LEFT JOIN c ON c.aid = a.id;

也许对你有帮助。

【讨论】:

去试一试,看看我会得到什么样的结果 它没有给我正确的输出,只有 1 行具有适当的 totalSum 和 totalCount,但没有其他行具有完整的总和和计数。我用我使用的查询编辑了我的主要帖子,因为它在那里更具可读性 对您的解决方案进行一些更改后,我解决了它。谢谢 我已经编辑了和你一样的答案,如果有帮助,请投票。 :)【参考方案2】:

我已经尝试过您的示例。

  SELECT * ,
(SELECT SUM(cnumber) FROM `table_c` WHERE `table_c`.`iaid` = `table_a`.`id`),
(SELECT COUNT(cnumber) FROM `table_c` WHERE `table_c`.`a.id` = `table_a`.`id`) 
FROM `table_a`,`table_b` WHERE `table_b`.`id` = `table_a`.`b.id` 

我收到了关注output。

【讨论】:

以上是关于从另一个表中选择 * 以及计数/总和的主要内容,如果未能解决你的问题,请参考以下文章

从另一个表中选择具有数据计数的数据[重复]

从另一个表上的 Where 表中选择计数

从另一个表中选择一个表的否定以及oracle的主表sql查询中的数据

如何使用mysql从图像表中获取总数?

如何选择评论数、投票总和以及活跃用户是不是投票

Mysql 从一个表中选择全部,从另一个表中选择一些使用别名