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
我有以下 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