текущей таблицы События:выбрать и GROUP BY несколько столбцов на основе Max()
| eventId | personId | type | title | score |
+-----------+------------+--------+---------+---------+
| 1 | 1 | movie | Mission | 12 |
| 2 | 1 | movie | UNCLE | 32 |
| 3 | 1 | show | U2 | 17 |
| 4 | 1 | show | Leroy | 13 |
| 5 | 2 | movie | Holmes | 19 |
| 6 | 2 | movie | Compton | 14 |
| 7 | 2 | show | Imagine | 22 |
| 8 | 2 | show | Kane | 22 |
MySQL Пример:
SELECT @personId:=personId as personId,
(
SELECT title FROM Events
WHERE rate = (SELECT MAX(score) FROM Events)
AND type = ‘movie’ AND [email protected]
) as movie,
(
SELECT title FROM Events
WHERE rate = (SELECT MAX(score) FROM Events)
AND type = ‘movie’ AND [email protected]
) as show,
FROM Events
GROUP BY personId
ORDER BY personId;
требуемый выход:
| personId | movie | show |
+------------+----------+---------+
| 1 | UNCLE | U2 |
| 2 | Holmes | Imagine |
Желаемый результат состоит в показать оценку MAX() для фильма и шоу на человека в таблице «События». Мой фактический вывод содержит NULLS и занимает очень много времени для загрузки. В моей таблице фактических событий содержится около 20 000 записей.
UPDATE Решение (на основе первых двух ответов для повышения производительности)
SELECT e.personId,
(
SELECT o.title
FROM Events o
LEFT JOIN Events b
ON o.personId = b.personId AND o.score < b.score
AND o.type = b.type
WHERE o.type = 'movie' AND o.personId=e.personId LIMIT 1
) as best_movie ,
(
SELECT o.title
FROM Events o
LEFT JOIN Events b
ON o.personId = b.personId AND o.score < b.score
AND o.type = b.type
WHERE o.type = 'show' AND o.personId=e.personId LIMIT 1
) as best_show
FROM Events e
GROUP BY e.personId
ORDER BY e.personId
почему шоу = 'Imagine' почему не' Kane'? – Alex
Потому что его eventId выше. – user3507028
eventId ниже для 'Imagine' vs' Kane' – Alex