如何为数字选择第一个唯一ID

时间:2019-09-23 13:00:49

标签: mysql select greatest-n-per-group

我想在数据库的第一个唯一ID中搜索数字Im搜索。假设我正在搜索数字: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)的ID(可以是最低的ID,但我不介意)。有什么想法,我可以为此使用单独的查询,但是我希望有使用一个的解决方案?

3 个答案:

答案 0 :(得分:2)

如果您只想要每个数字的最小ID:

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 :(得分:1)

  

所以我想为每个获取ID(可以是最低的ID,但我不介意)   编号721(1),969(4),337(8)。任何想法,我可以使用单独的查询   为此,但我希望有使用一个的解决方案?

假设您需要所有列,将

self(左)联接到具有过滤器的同一张表上可能是最合乎逻辑的方法。
或多或少像下面的查询。

查询(最小ID)

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 |

查询(最大ID)

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 |

请参见demo

如果只需要ID,数字列数据,查询就更简单

查询最小和最大ID

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   |

请参阅demo

性能说明
为了提高性能,所有这些查询都必须至少具有index(number, id)

答案 2 :(得分:0)

您可以在下面尝试-使用相关子查询

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