通过分组找到最大值
Find max value with grouping
我有一个用户table:
uid country credits
1 1 10
2 1 8
3 2 4
4 2 6
我想查找按国家/地区分组的最高积分的用户。
示例输出:
[0] => Array(
'country' => 1,
'uid' => 1,
'credits' => 10
),
[1] => Array(
'country' => 2,
'uid' => 4,
'credits' => 6
)
我试过了(没成功):
SELECT
U.*
FROM
`users` AS U
WHERE
U.user_deleted = 0
GROUP BY
U.country
HAVING
MAX(U.credits)
如何解决我的请求?
尝试
HAVING U.credits = MAX(U.credits)
只是HAVING MAX(u.credits)
没有多大意义。这就像说 HAVING 42
- 你没有将该值与任何东西进行比较,因此所有行都将隐式匹配。
试试这个查询:
SELECT
u.*
FROM
`users` AS u
WHERE
u.credits = (select max(u1.credits) from users u1 where u1.country=u.country group by u1.country)
SELECT *
FROM `users`
WHERE (country,credits)
IN (
SELECT country, max(credits)
FROM users
GROUP BY country
)
或 "hack" 获取最大的串联 credits-uid 并从中删除 uid:
SELECT country,
substr(max(concat(lpad(credits,10,'0'),uid)),11) as uid,
max(credits) as credits
FROM users
group by country
最后一个示例通常是最快的,因为它在 table 上一次性完成,没有子查询。
我有一个用户table:
uid country credits
1 1 10
2 1 8
3 2 4
4 2 6
我想查找按国家/地区分组的最高积分的用户。 示例输出:
[0] => Array(
'country' => 1,
'uid' => 1,
'credits' => 10
),
[1] => Array(
'country' => 2,
'uid' => 4,
'credits' => 6
)
我试过了(没成功):
SELECT
U.*
FROM
`users` AS U
WHERE
U.user_deleted = 0
GROUP BY
U.country
HAVING
MAX(U.credits)
如何解决我的请求?
尝试
HAVING U.credits = MAX(U.credits)
只是HAVING MAX(u.credits)
没有多大意义。这就像说 HAVING 42
- 你没有将该值与任何东西进行比较,因此所有行都将隐式匹配。
试试这个查询:
SELECT
u.*
FROM
`users` AS u
WHERE
u.credits = (select max(u1.credits) from users u1 where u1.country=u.country group by u1.country)
SELECT *
FROM `users`
WHERE (country,credits)
IN (
SELECT country, max(credits)
FROM users
GROUP BY country
)
或 "hack" 获取最大的串联 credits-uid 并从中删除 uid:
SELECT country,
substr(max(concat(lpad(credits,10,'0'),uid)),11) as uid,
max(credits) as credits
FROM users
group by country
最后一个示例通常是最快的,因为它在 table 上一次性完成,没有子查询。