1

前段时间我有一个问题如何编写一个带有多个的 sql 查询count()并在这里得到了需要的答案

现在假设我有完全相同的表

ID|group_name|username
----------------------
1 |    A     | user1
----------------------
2 |    B     | user2
----------------------
3 |    C     | user1

...

和完全相同的查询:

select count(*) from TABLE 
where username='user1'
having (sum(group_name ='A') > 0
     and sum(group_name = 'B') > 0)
     or sum(group_name = 'C') > 0")

但是现在我不想数,而是列出所有与此having语句对应的用户名。也就是说,列出A 和 B 或 C组中的所有用户名。

现在我只尝试在我的查询中替换和添加,如下count(*)所示usernamegroup by username

select username where username='user1' having (sum(group_name ='A') > 0 and sum(group_name = 'B') > 0) or sum(group_name = 'C') > 0") group by username

但我得到语法错误:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以username在第 1 行的 'GROUP BY LIMIT 0, 25'附近使用正确的语法

将不胜感激任何帮助。

4

3 回答 3

3

要列出满足您条件的用户名,您可以将查询编写为

select username
from table
group by username
having (
    sum(group_name ='A') > 0 and sum(group_name = 'B') > 0
) or sum(group_name = 'C') > 0
于 2018-05-23T07:23:41.750 回答
2

按用户名聚合并将您的WHERE逻辑移动到一个HAVING子句中:

SELECT username
FROM yourTable
GROUP BY username
HAVING
    SUM(CASE WHEN group_name NOT IN ('A', 'B') THEN 1 ELSE 0 END) = 0 OR
    SUM(CASE WHEN group_name NOT IN ('C') THEN 1 ELSE 0 END) = 0;

请注意WHERE,如果您真的想要完全是 A/B 或 C 的用户,那么您当前的逻辑实际上与您编写的内容不一致。

于 2018-05-23T07:23:50.527 回答
2

您可以使用此查询来获取username与给定条件匹配的 s:

select username from users having (count(group_name ='A') > 0 and count(group_name = 'B') > 0) or count(group_name = 'C') > 0;

我们尝试usernameusers其中获取group_namesAB的条目,或者 s 的条目group_name C

希望这可以帮助。

于 2018-05-23T07:34:09.183 回答