MySQL:只选择一些分组的行
我有以下数据库(小示例): 我不知道如何选择和分组具有相同操作(=登录)且点数高于5(对于所有操作)的用户名 预期成果:MySQL:只选择一些分组的行,mysql,Mysql,我有以下数据库(小示例): 我不知道如何选择和分组具有相同操作(=登录)且点数高于5(对于所有操作)的用户名 预期成果: username | COUNT | points(SUM) peter | 2 | 16 我尝试了子查询,但没有找到正确的解决方案。你知道怎么做吗?非常感谢你的帮助 对不起,我没有强调一个事实,即所有操作都必须是login。因此,结果将没有john,因为存在与此用户名相关的操作注释。尝试此查询 select username, action, sum(poi
username | COUNT | points(SUM)
peter | 2 | 16
我尝试了子查询,但没有找到正确的解决方案。你知道怎么做吗?非常感谢你的帮助
对不起,我没有强调一个事实,即所有操作都必须是login
。因此,结果将没有john
,因为存在与此用户名相关的操作注释。尝试此查询
select username, action, sum(points), count(*)
from
tbl
group by username, action
having sum(if (points<=5, 1, 0)) =0 and count(*) >=2
您可以通过聚合和巧妙的having
子句来实现这一点:
select username, sum(points), count(*)
from tbl
group by username
having sum(case when points <= 5 then 1 else 0 end) = 0 and -- count number with points < 5
max(action) = min(action) and -- all the actions are the same and
min(action) = 'login'
选择用户名、总和(点数)、计数(*)
来自tbl
按用户名分组
有总和(如有点数)
或:
为什么不'John'
?有一个'login'
操作,总共12
。对不起,我可能没有解释清楚。所有与用户名相关的操作都必须是登录
。对于用户名John
有操作注释
,因此我们不会用这个用户名计算。我会把它添加到我的问题中,谢谢谢谢,但我们不知道COUNT(*)
将超过2。第2个示例是,同一用户有2行操作登录
。是的,当然,但这不是初始条件,而是未知结果。可能我没有在描述中以最佳方式解释它。谢谢,但对我不起作用。即使我指定它只适用于操作登录
,结果中还包含usernamejohn
@user3316…你的问题不清楚。它说所有操作都必须相同,括号中有“login”。我认为这是一个说明它们如何都相同的示例,因为说“所有操作都必须登录”要容易得多。是的,对此很抱歉。但您编辑的答案只有在使用按用户名分组
而不是按用户名分组时才有效,操作
谢谢,所有示例都有效!您的第三个SQL与此答案之间是否有任何差异:?需要最小值和最大值,或者仅使用所有结果和登录
值是标准行为HAVING子句的r?不,这个答案是错误的。当您只有按用户名分组时,使用HAVING action='login'
甚至是无效的SQL。(不幸的是,默认的MySQL设置允许这样做。)谢谢!现在我明白了。当您更改登录值的顺序时,只有您的解决方案有效。非常感谢您提供详细的答案,现在效果很好!我可以问一个相关的问题吗?我又添加了一列示例
,除了用户名
和计数
之外,我希望所有值都来自ID最高的行。I尝试子查询,但未找到正确的解决方案。感谢您的帮助!提出另一个问题-并且不要忘记包括小提琴!
| USERNAME | ACTION | SUM(POINTS) | COUNT(*) |
----------------------------------------------
| peter | login | 16 | 2 |
select username, sum(points), count(*)
from tbl
group by username
having sum(case when points <= 5 then 1 else 0 end) = 0 and -- count number with points < 5
max(action) = min(action) and -- all the actions are the same and
min(action) = 'login'
SELECT username, COUNT(*) AS cnt, SUM(points) AS points
FROM tableX AS t
GROUP BY username
HAVING COUNT(*) = COUNT(CASE WHEN action = 'login' THEN action END)
AND SUM(points) > 5 ;
SELECT username, COUNT(*) AS cnt, SUM(points) AS points
FROM tableX AS t
WHERE action = 'login'
AND NOT EXISTS
( SELECT *
FROM tableX AS tt
WHERE tt.username = t.username
AND ( tt.action <> 'login' OR tt.action IS NULL )
)
GROUP BY username
HAVING SUM(points) > 5 ;
SELECT username, COUNT(*) AS cnt, SUM(points) AS points
FROM tableX AS t
GROUP BY username
HAVING MIN(action) = 'login'
AND MAX(action) = 'login'
AND SUM(points) > 5 ;