我有以下数据库(小例子):
ID | username | action | points
1 | matt | login | 3
2 | john | comment | 6
3 | john | login | 6
4 | peter | login | 8
5 | peter | login | 8
而且我不确定如何选择和分组具有相同操作(=登录)且点数高于 5(对于所有操作)的用户名。
预期结果:
username | COUNT | points(SUM)
peter | 2 | 16
我试过子查询,但没有找到正确的解决方案。你知道怎么做吗?非常感谢您的帮助!
抱歉,我没有强调所有操作都必须是login
。因此,结果将没有 john
,因为有与此用户名相关的操作 comment
。
最佳答案
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 ;
但我认为在 (username, login)
和 (username, points)
上有一个索引,这将是最有效的:
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 ;
关于MySQL:只选择一些分组的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16734078/