У меня есть таблица пользователей:
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)
Как я могу исправить свой запрос?
Попробуйте этот запрос:
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)
Пытаться
HAVING U.credits = MAX(U.credits)
Просто HAVING MAX(u.credits)
не имеет особого смысла. Это было бы как сказать HAVING 42
— вы не сравниваете это значение ни с чем, поэтому ВСЕ строки будут неявно сопоставлены.
SELECT *
FROM `users`
WHERE (country,credits)
IN (
SELECT country, max(credits)
FROM users
GROUP BY country
)
Или «взломать», получив максимум сцепленных кредитов-uid и вырезав из него uid:
SELECT country,
substr(max(concat(lpad(credits,10,'0'),uid)),11) as uid,
max(credits) as credits
FROM users
group by country
Последний пример, как правило, самый быстрый, потому что он выполняется за один проход таблицы без подзапросов.