MySQL:只选择一些分组的行

标签 mysql

我有以下数据库(小例子):

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/

相关文章:

mysql - 使用另一个表中的串联数据进行 SQL 更新

mysql innodb 最大事务大小

sql - 这个sql做什么

mysql - 构建 docker 镜像时初始化数据库脚本的最佳方法

php - 如何使用php中的while循环概念获取另一个页面中的单选按钮值

php - 获取mysql中列的总和

mysql - 选择边界框内的所有地理空间点

Mysql设置列中的最小数字(数字不会小于零)

mysql - 使用 sum 和 group 连接三个 sql 表

MySQL唯一键似乎只取varchar的前17个字符