Найти максимальное значение с группировкой

У меня есть таблица пользователей:

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)

Как я могу исправить свой запрос?

2

Решение

Попробуйте этот запрос:

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)
1

Другие решения

Пытаться

HAVING U.credits = MAX(U.credits)

Просто HAVING MAX(u.credits) не имеет особого смысла. Это было бы как сказать HAVING 42 — вы не сравниваете это значение ни с чем, поэтому ВСЕ строки будут неявно сопоставлены.

1

SELECT *
FROM `users`
WHERE (country,credits)
IN (
SELECT country, max(credits)
FROM users
GROUP BY country
)

Тест на sqlfiddle.com

Или «взломать», получив максимум сцепленных кредитов-uid и вырезав из него uid:

SELECT country,
substr(max(concat(lpad(credits,10,'0'),uid)),11) as uid,
max(credits) as credits
FROM users
group by country

Тест на sqlfiddle.com

Последний пример, как правило, самый быстрый, потому что он выполняется за один проход таблицы без подзапросов.

1
По вопросам рекламы [email protected]