MySQL选择一个不同的列,并选择相应的其他列

MySQL选择一个不同的列,并选择相应的其他列,mysql,Mysql,我想从FirstName列中选择DISTINCT结果,但我需要相应的ID和LastName 结果集只需要显示一个John,但是ID为1,而LastName为Doe。DISTINCT关键字的工作方式与您期望的不一样。当您使用选择不同的col1、col2、col3时,实际上您正在选择所有唯一的{col1、col2、col3}元组。尝试此查询 ID FirstName LastName 1 John Doe 2 Bugs Bunny 3

我想从
FirstName
列中选择
DISTINCT
结果,但我需要相应的
ID
LastName


结果集只需要显示一个
John
,但是
ID
为1,而
LastName
为Doe。

DISTINCT关键字的工作方式与您期望的不一样。当您使用
选择不同的col1、col2、col3
时,实际上您正在选择所有唯一的{col1、col2、col3}元组。

尝试此查询

ID   FirstName   LastName
1      John        Doe
2      Bugs        Bunny
3      John        Johnson

不确定是否可以使用MySQL实现这一点,但可以在T-SQL中使用CTE

 SELECT ID, FirstName, LastName FROM table GROUP BY(FirstName)
否则,您可能必须使用临时表

; WITH tmpPeople AS (
 SELECT 
   DISTINCT(FirstName),
   MIN(Id)      
 FROM People
)
SELECT
 tP.Id,
 tP.FirstName,
 P.LastName
FROM tmpPeople tP
JOIN People P ON tP.Id = P.Id

在IMO中,最好使用group by来显示不同的值和相应的字段

SELECT DISTINCT(firstName), ID, LastName from tableName GROUP BY firstName
SELECT firstName, ID, LastName from tableName GROUP BY firstName
现在您得到如下输出:

select * from tabel_name group by FirstName

如果你想这样回答

ID    FirstName     LastName
2     Bugs          Bunny
1     John          Doe
然后使用这个查询

ID    FirstName     LastName
1     John          Doe
2     Bugs          Bunny

为了避免在不使用聚合函数的情况下使用
groupby
时出现潜在的意外结果,正如在接受的答案中所使用的那样,因为MySQL可以在不使用聚合函数的情况下自由地检索分组数据集中的任何值,并且只会出现
完全\u groupby
问题。请考虑使用排除连接。

排除连接-明确实体 假设firstname和lastname是唯一索引的(无歧义的),则
分组依据
的替代方法是使用
左联接进行排序,以过滤结果集,否则称为排除联接

升序(A-Z)

从A-Z检索按lastname排序的不同firstname

查询

选择t1*
表_中的名称为t1
左联接表\u名称为t2
在t1.firstname=t2.firstname上
和t1.lastname>t2.lastname
其中t2.id为空;
结果

select * from table_name group by FirstName order by ID
| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  1 |      John |      Doe |
(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson'),
(4, 'John', 'Doe'),
(5, 'John', 'Johnson')
| id | firstname | lastname |
|----|-----------|----------|
|  1 |      John |      Doe |
|  2 |      Bugs |    Bunny |
| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  1 |      John |      Doe |
| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  3 |      John |  Johnson |
降序(Z-A)

从Z-A检索按lastname排序的不同firstname

查询

选择t1*
表_中的名称为t1
左联接表\u名称为t2
在t1.firstname=t2.firstname上
和t1.lastname
结果

select * from table_name group by FirstName order by ID
| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  1 |      John |      Doe |
(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson'),
(4, 'John', 'Doe'),
(5, 'John', 'Johnson')
| id | firstname | lastname |
|----|-----------|----------|
|  1 |      John |      Doe |
|  2 |      Bugs |    Bunny |
| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  1 |      John |      Doe |
| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  3 |      John |  Johnson |
然后,您可以根据需要对结果数据进行排序


排除连接-不明确实体 如果名字和姓氏的组合不唯一(不明确),并且有多行具有相同的值,则可以通过在联接条件中包含OR条件来过滤结果集,以同时按id进行过滤

表格名称数据

| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  3 |      John |  Johnson |
| id | firstname | lastname |
|----|-----------|----------|
|  1 |      John |      Doe |
|  2 |      Bugs |    Bunny |
查询

选择t1*
表_中的名称为t1
左联接表\u名称为t2
在t1.firstname=t2.firstname上
和(t1.lastname>t2.lastname
或者(t1.firstname=t1.firstname和t1.lastname=t2.lastname和t1.id>t2.id))
其中t2.id为空;
结果

select * from table_name group by FirstName order by ID
| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  1 |      John |      Doe |
(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson'),
(4, 'John', 'Doe'),
(5, 'John', 'Johnson')
| id | firstname | lastname |
|----|-----------|----------|
|  1 |      John |      Doe |
|  2 |      Bugs |    Bunny |
| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  1 |      John |      Doe |
| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  3 |      John |  Johnson |

复合
IN()
子查询-明确的实体 对于较大的数据集,使用排除联接可能非常慢。 如果有明确的条目,另一种方法是对
MIN/MAX
聚合子查询使用复合
IN()
条件

升序(A-Z)

查询

选择t1*
表_中的名称为t1
其中(t1.firstname,t1.lastname)位于(
选择firstname,MIN(lastname)
从表\u名称
按名字分组
)
结果

select * from table_name group by FirstName order by ID
| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  1 |      John |      Doe |
(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson'),
(4, 'John', 'Doe'),
(5, 'John', 'Johnson')
| id | firstname | lastname |
|----|-----------|----------|
|  1 |      John |      Doe |
|  2 |      Bugs |    Bunny |
| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  1 |      John |      Doe |
| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  3 |      John |  Johnson |
降序(Z-A)

查询

选择t1*
表_中的名称为t1
其中(t1.firstname,t1.lastname)位于(
选择firstname,MAX(lastname)
从表\u名称
按名字分组
)
结果

select * from table_name group by FirstName order by ID
| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  1 |      John |      Doe |
(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson'),
(4, 'John', 'Doe'),
(5, 'John', 'Johnson')
| id | firstname | lastname |
|----|-----------|----------|
|  1 |      John |      Doe |
|  2 |      Bugs |    Bunny |
| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  1 |      John |      Doe |
| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  3 |      John |  Johnson |

复合
IN()
依赖子查询-不明确实体 通过在id列上添加一个带有
MIN/MAX
的从属子查询,可以将相同的理论应用于composite
IN()
子查询方法中的不明确排除联接

查询

选择t1*
表_中的名称为t1
t1.id在哪里(
选择最小值(id)
从表\u名称
其中(t1.firstname,t1.lastname)位于(
选择firstname,MIN(lastname)
从表\u名称
按名字分组
)
按姓氏分组
);
结果

select * from table_name group by FirstName order by ID
| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  1 |      John |      Doe |
(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson'),
(4, 'John', 'Doe'),
(5, 'John', 'Johnson')
| id | firstname | lastname |
|----|-----------|----------|
|  1 |      John |      Doe |
|  2 |      Bugs |    Bunny |
| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  1 |      John |      Doe |
| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  3 |      John |  Johnson |

有序子查询 编辑

我的原始答案使用的是有序子查询,是在MySQL 5.7.5之前编写的,由于与的更改,该答案不再适用。请使用上面的一个例子

注意这一点也很重要;当禁用了
仅\u FULL\u GROUP\u BY
时(MySQL 5.7.5之前的原始行为),在不使用聚合函数的情况下使用
GROUP BY
可能会产生意外的结果,因为MySQL可以自由选择分组数据集中的任何

这意味着可以检索与检索到的
firstname
行不关联的
ID
lastname


警告

使用MySQL时,
groupby
orderby

确保预期结果的最佳实现方法是使用有序子查询过滤结果集范围

表格名称数据

| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  3 |      John |  Johnson |
| id | firstname | lastname |
|----|-----------|----------|
|  1 |      John |      Doe |
|  2 |      Bugs |    Bunny |
查询

从中选择*(
从表中选择*按ID描述命名顺序
)AS t1
按名字分组
结果(MySQL 5.6)


比较

演示将
分组依据
排序依据

查询

按名字顺序按ID描述从表中选择*
结果(MySQL 5.6)

使用时请记住