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
的从属子查询,可以将相同的理论应用于compositeIN()
子查询方法中的不明确排除联接
查询
选择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)
使用时请记住