MySQL:只选择一些分组的行

MySQL:只选择一些分组的行,mysql,Mysql,我有以下数据库(小示例): 我不知道如何选择和分组具有相同操作(=登录)且点数高于5(对于所有操作)的用户名 预期成果: username | COUNT | points(SUM) peter | 2 | 16 我尝试了子查询,但没有找到正确的解决方案。你知道怎么做吗?非常感谢你的帮助 对不起,我没有强调一个事实,即所有操作都必须是login。因此,结果将没有john,因为存在与此用户名相关的操作注释。尝试此查询 select username, action, sum(poi

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

我不知道如何选择和分组具有相同操作(=登录)且点数高于5(对于所有操作)的用户名

预期成果:

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行操作
登录
。是的,当然,但这不是初始条件,而是未知结果。可能我没有在描述中以最佳方式解释它。谢谢,但对我不起作用。即使我指定它只适用于操作
登录
,结果中还包含username
john
@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 ;