У меня есть совет для тех, кто хочет получить различные агрегированные значения из одной таблицы.
Допустим, у меня есть таблица с пользователями и таблица с очками, которые получают пользователи. Таким образом, связь между ними составляет 1: N (один пользователь, много точек записей).
Теперь в таблице «Баллы» я также храню информацию о том, за что пользователь получил баллы (логин, нажатие на баннер и т. Д.). И я хочу перечислить всех пользователей, упорядоченных по SUM(points)
И затем по SUM(points WHERE type = x)
. То есть упорядочено по всем баллам, которые пользователь имеет, а затем по баллам, которые пользователь получил за определенное действие (например, вход в систему).
SQL будет:
SELECT SUM(points.points) AS points_all, SUM(points.points * (points.type = 7)) AS points_login
FROM user
LEFT JOIN points ON user.id = points.user_id
GROUP BY user.id
Прелесть этого в том, что SUM(points.points * (points.type = 7))
, где внутренняя скобка оценивается либо в 0, либо в 1, таким образом, умножая данное значение очков на 0 или 1, в зависимости от того, равно ли оно типу точек, которые мы хотим. *