MySQL выбирает максимальную запись в группе по
Я пытаюсь создать запрос в таблице, содержащей около 500 000 записей и около 50 или 60 столбцов. Мне нужно собрать эти записи в группы и выбрать максимальную запись в каждой группе.
Чтобы упростить задачу, у меня есть таблица следующим образом
+----+-------------+----------+--------+
| id | external_id | group_id | mypath |
+----+-------------+----------+--------+
| 1 | 1003 | 1 | a |
| 2 | 1004 | 2 | b |
| 3 | 1005 | 2 | c |
+----+-------------+----------+--------+
Простая группа:
select * from temp GROUP BY group_id
который возвращает
+----+-------------+----------+--------+
| id | external_id | group_id | mypath |
+----+-------------+----------+--------+
| 1 | 1003 | 1 | a |
| 2 | 1004 | 2 | b |
+----+-------------+----------+--------+
Приятно, но не то, что я хочу. То, что я хочу, это вся запись для max enternal_id в каждой группе. Другими словами
+----+-------------+----------+--------+
| id | external_id | group_id | mypath |
+----+-------------+----------+--------+
| 1 | 1003 | 1 | a |
| 3 | 1005 | 2 | c |
+----+-------------+----------+--------+
Каким-то образом я хочу разместить здесь инструкцию max (external_id), чтобы отфильтровать то, что нужно, но пока все мои расследования не удались. Некоторые рекомендации будут оценены. Важно, чтобы при возврате max (external_id), когда вся запись выбрана, поскольку столбец пути отличается.
Ответы
Ответ 1
Много информации на http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/
Это всегда вызывало раздражение в MySQL. Были вокруг него способы, такие как объединение нескольких полей (начиная с external_id), а затем выбор MAX(), а затем их разблокирование.
Я предлагаю вам использовать производную таблицу. Первая таблица (t1) получена из простого запроса, в котором вы идентифицируете MAX(external_id)
, затем присоединяетесь к этому, чтобы получить остальные данные.
ЭТО ТОЛЬКО ЕСЛИ external_id
УНИКАЛЬНО
SELECT
t1.group_id, some_table.id, some_table.mypath
FROM
(
SELECT group_id, MAX(external_id) AS external_id
FROM some_table
GROUP BY group_id
) as t1
INNER JOIN
sometable ON t1.external_id = sometable.external_id
WHERE ...