Mysql 每组的最大计数

Mysql max of counts per group

我有以下 table:

+---------+--------+-------+
| client  | session| boat  |
+---------+--------+-------+
|       1 |   1943 |     3 |
|       1 |   1943 |     4 |
|       1 |   1944 |     3 |
|       1 |   1944 |     4 |
|       1 |   1945 |     4 |
|       2 |   1944 |     3 |
|       2 |   1944 |     4 |
|       3 |   1944 |     3 |
+---------+--------+-------+

我想获得最大的船数,然后我这样做了:

SELECT boat,session,max(counter) as max_boats FROM (SELECT boat,COUNT(boat) as counter,session FROM `test` GROUP BY boat,session) as cont2 GROUP BY boat

结果:

+------+---------+-----------+
| boat | session | max_boats |
+------+---------+-----------+
|    3 |    1943 |         3 |
|    4 |    1943 |         2 |
+------+---------+-----------+

所以,我的问题是这个查询返回我 "session = 1943",这是错误的。正如您在原始 table 中看到的那样,3 号船有三排,但 session 1944,4 号船有两排 session,但也有 session 1944。

问题是,当我执行 max(counter) 时,MySQL returns 我第一个 session,而不是对应于 max(counter) 的行。

可能是我的方法不对,整个查询都是错误的。

感谢您的回答。

解决方案是:

+------+---------+-----------+
| boat | session | max_boats |
+------+---------+-----------+
|    3 |    1944 |         3 |
|    4 |    1944 |         2 |
+------+---------+-----------+

这个有用吗?

SELECT COUNT(*) AS `max_boats`, `session` FROM `boats` GROUP BY `session` ORDER BY COUNT(*) DESC

输出:

+-----------+---------+
| max_boats | session |
+-----------+---------+
|         5 |    1944 |
|         2 |    1943 |
|         1 |    1945 |
+-----------+---------+

您可以使用 LIMIT 1

将输出限制为第一个
SELECT COUNT(*) AS `max_boats`, `session` FROM `boats` GROUP BY `session` ORDER BY COUNT(*) DESC

输出:

+-----------+---------+
| max_boats | session |
+-----------+---------+
|         5 |    1944 |
+-----------+---------+

Fiddle: http://sqlfiddle.com/#!9/59e53/3

试试这个!

SELECT COUNT(*), client, session
FROM `test` 
GROUP BY client, session
ORDER BY COUNT(*) DESC
LIMIT 1

:)

这是一种获取方法,可能不是最好的方法,您也可以查看其他选项。

select 
x.boat, 
x.session, 
max_boats
from (
  select 
  boat, 
  session, 
  count(*) cnt
  from boats
  group by boat, session
)x
join(
  select boat, 
  max(cnt) max_boats
  from(
    select 
    boat, 
    session, 
    count(*) cnt
    from boats
    group by boat, session
  )y
  group by boat
)t on x.boat = t.boat and x.cnt = t.max_boats