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 ...