MySQL: очередной вопрос про сортировку по двум полям

Рейтинг: 0Ответов: 2Опубликовано: 01.03.2023

Имеется таблица:

| id | name | 
+----+------+
|  1 | john | 
|  2 | alex | 
|  4 | ivan | 
|  5 | ivan | 
|  6 | alex | 
|  8 | john |

Нужно отсортировать по id, но так, чтобы имена были не перемешаны, а сгруппированы:

| id | name | 
+----+------+
|  1 | john | 
|  8 | john | 
|  2 | alex | 
|  6 | alex | 
|  4 | ivan | 
|  5 | ivan |

То есть если у наименьшего id = 1 имя john, то все остальные записи с именем john должны идти следом отсортированные по id. Как это можно сделать?

UPDATE: MySQL 5.1

Ответы

▲ 1Принят

Для таких диких, как я - по старинке

select t.id, t.name 
  from  t 
     join 
       (select min(id) orderid, name from t group by name) as o 
     on t.name = o.name 
  order by orderid, t.id

demo

▲ 1
WITH
cte AS (
    SELECT id, name, MIN(id) OVER (PARTITION BY name) min_id
    FROM source_table
)
SELECT id, name
FROM cte
ORDER BY min_id, id