从子表中选择计数
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
现在我需要从用户表中选择 id
、name
、etc
等各种字段以及 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
表中的行。
【讨论】:
以上是关于从子表中选择计数的主要内容,如果未能解决你的问题,请参考以下文章