MySQL Заказ по дате и группировка по имени - PullRequest
1 голос
/ 19 апреля 2020

Таблица

mysql> select * from temp;
+--------+---------------------+
| name   | created_at          |
+--------+---------------------+
| second | 2020-01-01 12:00:00 |
| first  | 2020-01-01 12:10:00 |
| second | 2020-01-01 12:20:00 |
| third  | 2020-01-01 12:30:00 |
| third  | 2020-01-01 12:40:00 |
| first  | 2020-01-01 12:50:00 |
+--------+---------------------+

В приведенном выше примере я хочу сначала упорядочить по created_at и показать строки с одинаковыми именами.

Поэтому я пытаюсь для заказа с созданным именем, имя.

mysql> select * from temp order by created_at, name;
+--------+---------------------+
| name   | created_at          |
+--------+---------------------+
| second | 2020-01-01 12:00:00 |
| first  | 2020-01-01 12:10:00 |
| second | 2020-01-01 12:20:00 |
| third  | 2020-01-01 12:30:00 |
| third  | 2020-01-01 12:40:00 |
| first  | 2020-01-01 12:50:00 |
+--------+---------------------+

Но это не группировка имени.

После поиска по заказу я обнаружил, что в случае второго столбца он применяется только к результату первого заказа по.

Желаемый результат

+--------+---------------------+
| name   | created_at          |
+--------+---------------------+
| second | 2020-01-01 12:00:00 |
| second | 2020-01-01 12:20:00 |
| first  | 2020-01-01 12:10:00 |
| first  | 2020-01-01 12:50:00 |
| third  | 2020-01-01 12:30:00 |
| third  | 2020-01-01 12:40:00 |
+--------+---------------------+

Как я могу манипулировать запросом для его достижения?

Ответы [ 3 ]

2 голосов
/ 19 апреля 2020

Сначала необходимо заказать не менее created_at каждой именованной группы, а затем - created_at.

SELECT name, created_at
FROM TEMP tem
ORDER BY
    (SELECT MIN(tem2.created_at)
     FROM TEMP tem2 
     WHERE tem.name = tem2.name), created_at

Сильфонная часть получит минимум created_at для группы имен из каждого имени строки

SELECT MIN(tem2.created_at)
         FROM TEMP tem2 
         WHERE tem.name = tem2.name

Теперь каждая группа упорядочена по минимуму группы created_at, а затем упорядочивает названия каждой группы по created_at.

1 голос
/ 19 апреля 2020

Если вы используете MySQL 8.0, вы можете просто использовать окно min() для заказа:

select *
from temp
order by 
    min(created_at) over(partition by name), 
    created_at

Окно min() дает вам минимум created_at для всех записей, которые имеют тот же name.

В более ранних версиях я использовал коррелированный подзапрос непосредственно в предложении order by:

select *
from temp t
order by
    (select min(t1.created_at) from temp t1 where t1.name = t.name),
    created_at
1 голос
/ 19 апреля 2020

Вы можете присоединиться к этой таблице с подзапросом минимального created_at для имени и упорядочить по нему:

SELECT   t.name, created_at
FROM     mytable t
JOIN     (SELECT   name, MIN(created_at) AS min_created_at
          FROM     mytable
          GROUP BY name) m ON t.name = m.name
ORDER BY min_created_at, t.name, t.created_at
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...