Уникальные, но последние строки - PullRequest
0 голосов
/ 13 марта 2020

Я использую mysql 5.7 сервер и у меня есть следующая таблица с id в качестве ПЕРВИЧНОГО КЛЮЧА.

Моя таблица

mysql> select * from abc;
+----+---------+-------+
| id | name    | place |
+----+---------+-------+
|  1 | asd1    | abcd1 |
|  2 | asd2    | abcd1 |
|  3 | asd1    | abcd2 |
|  4 | asd3    | abcd1 |
|  5 | asd4    | abcd1 |
|  6 | asd1    | abcd1 |
|  7 | asd2    | abcd2 |
|  8 | asd3    | abcd2 |
|  9 | asd4    | abcd2 |
| 10 | asd3    | abcd1 |
| 11 | asd4    | abcd1 |
| 12 | asd4    | abcd2 |
| 13 | asd1    | abcd2 |
+----+---------+-------+
13 rows in set (0.00 sec)

Ожидаемый результат

Я хочу выбрать строки с уникальным name, имеющие самые последние id.

Другими словами, мой ожидаемый результат должен быть следующим:

+----+---------+-------+
| id | name    | place |
+----+---------+-------+
| 13 | asd1    | abcd2 |
|  7 | asd2    | abcd2 |
| 10 | asd3    | abcd1 |
| 12 | asd4    | abcd2 |
+----+---------+-------+
4 rows in set (0.00 sec)

То, что я пытался

mysql> select * from abc group by name order by id desc;
+----+------+-------+
| id | name | place |
+----+------+-------+
|  5 | asd4 | abcd1 |
|  4 | asd3 | abcd1 |
|  2 | asd2 | abcd1 |
|  1 | asd1 | abcd1 |
+----+------+-------+
4 rows in set (0.00 sec)

mysql> select * from (select * from abc as t order by t.id desc) as st1 group by t1.orderID;
+----+------+-------+
| id | name | place |
+----+------+-------+
|  1 | asd1 | abcd1 |
|  2 | asd2 | abcd1 |
|  4 | asd3 | abcd1 |
|  5 | asd4 | abcd1 |
+----+------+-------+
4 rows in set (0.00 sec)

mysql> select * from abc l inner join (select * from abc group by name) r on l.id = r.id;
+----+------+-------+----+------+-------+
| id | name | place | id | name | place |
+----+------+-------+----+------+-------+
|  1 | asd1 | abcd1 |  1 | asd1 | abcd1 |
|  2 | asd2 | abcd1 |  2 | asd2 | abcd1 |
|  4 | asd3 | abcd1 |  4 | asd3 | abcd1 |
|  5 | asd4 | abcd1 |  5 | asd4 | abcd1 |
+----+------+-------+----+------+-------+
4 rows in set (0.01 sec)

Вопрос

Что будет правильным SQL, чтобы получить Ожидаемый результат ? Точный и простой будет предпочтительным.

Ответы [ 3 ]

3 голосов
/ 13 марта 2020

Вы можете отфильтровать верхнюю запись по группе с помощью коррелированного подзапроса:

select a.*
from abc a
where a.id = (select max(a1.id) from abc a1 where a1.name = a.name)
order by a.name

Для производительности с этим запросом требуется индекс (name, id).

1 голос
/ 13 марта 2020
0 голосов
/ 13 марта 2020

Вам нужно ниже -

SELECT MAX(id), name
FROM abc
GROUP BY name
...