У меня есть следующая база данных (маленький пример):
ID | username | action | points | example
1 | matt | login | 3 | 135
2 | john | comment | 6 | 156
3 | john | login | 6 | 189
4 | peter | login | 8 | 125
5 | peter | login | 8 | 165
Я хотел выбрать и сгруппировать имена пользователей, которые имеют одно и то же действие login
и количество точек выше 5 (для всех действий). Все действия должны быть login
. Таким образом, результаты будут без john
, потому что есть действие comment
, связанное с этим именем пользователя.
Связанный вопрос: MySQL: выберите только некоторые сгруппированные строки
Возможное решение:
SELECT username, COUNT(*) AS cnt, SUM(points) AS points
FROM tableX AS t
GROUP BY username
HAVING MIN(action) = 'login'
AND MAX(action) = 'login'
AND SUM(points) > 5 ;
И результаты:
username | COUNT | points(SUM)
peter | 2 | 16
Но тогда я хотел бы добавить к результатам все остальные значения из строки с самым высоким ID. Я попробовал подзапрос, но не нашел правильного решения.
Ожидаемые результаты:
ID | username | COUNT | points(SUM) | points | example
5 | peter | 2 | 16 | 8 | 165
Есть ли у вас идеи? Большое вам спасибо!
Попробуйте следующее:
SELECT DISTINCT MAX(ID), username, action, SUM(points) as pointsSum, MAX(points) as pointsMax, MAX(example) as example
FROM tableX
WHERE action='login' GROUP BY username