ID FirstName LastName
1 John Doe
2 Bugs Bunny
3 John Johnson
Run Code Online (Sandbox Code Playgroud)
我想DISTINCT从FirstName列中选择结果,但我需要相应的ID和LastName.
结果集只需显示一个John,但需要ID1和1 LastName的Doe.
diE*_*cho 177
试试这个查询
SELECT ID, FirstName, LastName FROM table GROUP BY(FirstName)
Run Code Online (Sandbox Code Playgroud)
Bri*_*oll 57
该DISTINCT关键字并未真正发挥你期待它的方式.当你使用时,SELECT DISTINCT col1, col2, col3你实际上选择了所有唯一的{col1,col2,col3}元组.
fyr*_*rye 51
编辑
原始答案是在MySQL 5.7.5之前编写的,由于默认更改而不再适用ONLY_FULL_GROUP_BY.同样重要的是要注意,当ONLY_FULL_GROUP_BY禁用时,使用GROUP BY没有聚合函数将产生意外结果,因为MySQL可以自由选择被分组的数据集中的任何值[原文如此].
假设firstname和lastname是唯一索引的,GROUP BY则可以使用a LEFT JOIN来对结果集进行排序.见示范
按降序检索由姓氏排序的不同名字(ZA)
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND t1.lastname < t2.lastname
WHERE t2.id IS NULL;
#Results
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 3 | John | Johnson |
Run Code Online (Sandbox Code Playgroud)
按升序检索由姓氏排序的不同名字(AZ)
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND t1.lastname > t2.lastname
WHERE t2.id IS NULL;
#Results
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 1 | John | Doe |
Run Code Online (Sandbox Code Playgroud)
然后,您可以根据需要订购结果数据.
如果名字和姓氏组合不是唯一的并且您有多行具有相同值,则可以通过在联接上包含OR条件来筛选结果集以选择特定ID.看演示.
table_name数据:
(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson'),
(4, 'John', 'Doe'),
(5, 'John', 'Johnson')
Run Code Online (Sandbox Code Playgroud)
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND (t1.lastname > t2.lastname
OR (t1.firstname = t1.firstname AND t1.lastname = t2.lastname AND t1.id > t2.id))
WHERE t2.id IS NULL;
#Results
| id | firstname | lastname |
|----|-----------|----------|
| 1 | John | Doe |
| 2 | Bugs | Bunny |
Run Code Online (Sandbox Code Playgroud)
警告
使用时,使用MySQL GROUP BY并不会总是产生预期的结果ORDER BY:参见:测试用例示例.
确保预期结果的最佳实现方法是使用像这样的子查询来过滤结果集范围.
table_name数据:
(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson')
Run Code Online (Sandbox Code Playgroud)
询问
SELECT * FROM (
SELECT * FROM table_name ORDER BY ID DESC
) AS t1
GROUP BY FirstName
#Results
| ID | first | last |
|----|-------|---------|
| 2 | Bugs | Bunny |
| 3 | John | Johnson |
Run Code Online (Sandbox Code Playgroud)
与
SELECT * FROM table_name GROUP BY FirstName ORDER BY ID DESC
#Results
| ID | first | last |
|----|-------|-------|
| 2 | Bugs | Bunny |
| 1 | John | Doe |
Run Code Online (Sandbox Code Playgroud)
小智 21
SELECT ID,LastName
From TABLE_NAME
GROUP BY FirstName
HAVING COUNT(*) >=1
Run Code Online (Sandbox Code Playgroud)
小智 5
怎么样
`SELECT
my_distinct_column,
max(col1),
max(col2),
max(col3)
...
FROM
my_table
GROUP BY
my_distinct_column`
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
278501 次 |
| 最近记录: |