从子表中选择计数

Posted

技术标签:

【中文标题】从子表中选择计数【英文标题】:Select count from sub table 【发布时间】:2014-02-23 17:12:10 【问题描述】:

我需要从查询中涉及的子表/连接表之一获取计数。我将用一个简单的例子来演示:

表:用户

    id             name            etc
-------------------------------------------
    1               u1
    2               u2

表格:锻炼

    id             userId            etc
-------------------------------------------
    1               1
    2               1

现在我需要从用户表中选择 idnameetc 等各种字段以及 exercise 表中各种用户 ID 的计数

例如,在上述情况下,我需要输出

    id             name            count
-------------------------------------------
    1               u1               2 --since two u1's are present in exercise
    2               u2               0 --since no u2's are present in exercise

我试过这个:但我得到语法错误:

--actual query is very complex
SELECT u.id, u.name, COUNT(e.*)
FROM   user AS u
JOIN   exercise AS e ON u.id =  e.userId 

我试过这个:但我再次遇到语法错误:

--actual query is very complex
SELECT u.id, u.name, (SELECT COUNT(*) FROM e)
FROM   user AS u
JOIN   exercise AS e ON u.id =  e.userId 

这可以作为子查询工作,但速度非常慢(每个表中大约 10000 行需要 5 到 13 秒):

--actual query is very complex
SELECT u.id, u.name, (SELECT COUNT(*) FROM exercise WHERE e.userId = u.id)
FROM   user AS u

join 的帮助下,有没有一种方法可以在一个查询中获取count 信息?子查询对我的需求来说非常慢。

【问题讨论】:

你探索过GROUP BY吗? @AzizShaikh 我有,我想我很清楚,但在这种情况下,我无法让它工作。给我一些大脑放屁的时刻! 【参考方案1】:

尝试使用GROUP BY,如下所示:

SELECT u.id, u.name, COUNT(e.userId)
FROM   user AS u
LEFT JOIN exercise AS e 
ON u.id =  e.userId
GROUP BY u.id 

【讨论】:

好的,我明白了,我必须加强我的 sql-fu。一个问题,你为什么在这里使用左连接? 因为左连接意味着从主表(即用户)中检索所有记录,从辅助表(即练习)中检索相关记录。 tizag.com/mysqlTutorial/mysqlleftjoin.php @IHashable Left join 仍然会从用户表中返回您的行,即使练习表中没有记录。 @AzizShaikh 我认为 u.name 将需要在 group by 子句中。 @Aziz Shaikh,我试过了,这又太慢了,几乎和子查询方法一样慢。还有一个问题。在我的主要查询中返回重复项。现在执行count(e.userId) 也会返回重复计数。但是方向 +1。【参考方案2】:

试试这个:

SELECT u.id, u.name, COUNT(e.userId)
FROM  user AS u
LEFT JOIN exercise AS e 
ON u.id =  e.userId
GROUP BY u.id,u.name

即使exercise 表中没有记录,左连接仍会返回user 表中的行。

【讨论】:

以上是关于从子表中选择计数的主要内容,如果未能解决你的问题,请参考以下文章

从一个表中选择,并从另外两个表中进行计数

从连接表中选择计数

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

从两个表中选择和计数

如何从表中选择所有列并计数?

HANA SQL 从一个表中找到的多个表中选择计数 (*)