Как выбрать первый уникальный идентификатор для номеров - PullRequest
0 голосов
/ 23 сентября 2019

Я хочу найти в БД первый уникальный идентификатор для номеров, которые я ищу.Допустим, я ищу числа: 721, 969, 337. Все эти числа имеют по крайней мере 3 записи в БД, например:

id, number, name
1, 721, valueA
2, 721, valueB
3, 721, valueC
4, 969, valueD
5, 969, valueE
6, 969, valueF
7, 969, valueG
8, 337, valueH
9, 337, valueI
10, 337, valueJ

Так что я хочу получить идентификатор (может быть самым низким, но я неум) для каждого числа 721 (1), 969 (4), 337 (8).Любые идеи, я мог бы использовать отдельные запросы для этого, но я надеюсь, что есть решение, использующее один?

Ответы [ 3 ]

2 голосов
/ 23 сентября 2019

Если вам нужен только минимальный идентификатор для каждого номера:

SELECT number, MIN(id) id FROM mytable GROUP BY number

Если вам нужна вся запись:

SELECT id, number, name
FROM mytable t
WHERE NOT EXISTS (
    SELECT 1
    FROM mytable t1
    WHERE t1.number = t.number AND t1.id < t.id
)

Или, если вы используете MySQL 8.0:

SELECT id, number, name
FROM (
    SELECT t.* ROW_NUMBER() OVER(PARTITON BY number ORDER by id) rn FROM mytable t
) x
WHERE rn = 1
1 голос
/ 23 сентября 2019

Итак, я хочу получить идентификатор (может быть самым низким, но я не против) для каждого числа 721 (1), 969 (4), 337 (8).Любые идеи, я мог бы использовать отдельные запросы для этого, но я надеюсь, что есть решение, использующее один?

Самостоятельное (левое) объединение в одной таблице с фильтром может быть наиболее логичным подходом, если вам нужноесть все столбцы ..Более или менее, как запросы ниже.

Запрос (минимальный идентификатор)

SELECT 
   table_1.id
 , table_1.number
 , table_1.name
FROM 
 t AS table_1
LEFT JOIN 
 t AS table_2
ON
   table_1.number = table_2.number 
 AND
   table_1.id > table_2.id 

 AND
   table_1.number IN(721, 969, 337)
WHERE
 table_2.id IS NULL

Результат

| id  | number | name   |
| --- | ------ | ------ |
| 1   | 721    | valueA |
| 4   | 969    | valueD |
| 8   | 337    | valueH |

Запрос (максимальный идентификатор)

SELECT 
   table_1.id
 , table_1.number
 , table_1.name
FROM 
 t AS table_1
LEFT JOIN 
 t AS table_2
ON
   table_1.number = table_2.number 
 AND
   table_1.id < table_2.id 

 AND
   table_1.number IN(721, 969, 337)
WHERE
 table_2.id IS NULL;

Результат

| id  | number | name   |
| --- | ------ | ------ |
| 3   | 721    | valueC |
| 7   | 969    | valueG |
| 10  | 337    | valueJ |

см. демо

Если вам нужен только идентификатор, число столбцов данных запрос более простой

Минимальный и максимальный идентификатор запроса

SELECT number, MIN(id) id FROM t WHERE number IN(721, 969, 337) GROUP BY number;

SELECT number, MAX(id) id FROM t WHERE number IN(721, 969, 337) GROUP BY number;

Результаты

**min**

| number | id  |
| ------ | --- |
| 337    | 8   |
| 721    | 1   |
| 969    | 4   |

**max**

| number | id  |
| ------ | --- |
| 337    | 10  |
| 721    | 3   |
| 969    | 7   |

см. демо

примечание к производительности Для производительности все эти запросы должны иметь index(number, id) при минимуме ..

0 голосов
/ 23 сентября 2019

Вы можете попробовать ниже - используя коррелированный подзапрос

 select * from tablename a
 where id in (select min(id) from tablename b where a.number=b.number)
...