根据单个不同列选择唯一行

Flo*_*Flo 68 t-sql sql-server

我想选择有a的行distinct email,请参阅下面的示例表:

+----+---------+-------------------+-------------+
| id | title   | email             | commentname |
+----+---------+-------------------+-------------+
|  3 | test    | rob@hotmail.com   | rob         |
|  4 | i agree | rob@hotmail.com   | rob         |
|  5 | its ok  | rob@hotmail.com   | rob         |
|  6 | hey     | rob@hotmail.com   | rob         |
|  7 | nice!   | simon@hotmail.com | simon       |
|  8 | yeah    | john@hotmail.com  | john        |
+----+---------+-------------------+-------------+
Run Code Online (Sandbox Code Playgroud)

期望的结果是:

+----+-------+-------------------+-------------+
| id | title | email             | commentname |
+----+-------+-------------------+-------------+
|  3 | test  | rob@hotmail.com   | rob         |
|  7 | nice! | simon@hotmail.com | simon       |
|  8 | yeah  | john@hotmail.com  | john        |
+----+-------+-------------------+-------------+
Run Code Online (Sandbox Code Playgroud)

我不关心id返回哪个列值的地方.什么是必需的SQL?

Tur*_*bot 92

TSQL中的快速版本

SELECT a.*
FROM emails a
INNER JOIN 
  (SELECT email,
    MIN(id) as id
  FROM emails 
  GROUP BY email 
) AS b
  ON a.email = b.email 
  AND a.id = b.id;
Run Code Online (Sandbox Code Playgroud)

  • 这里不需要`distinct`关键字.而且,似乎只是`id`的加入也可以做到这一点. (8认同)
  • 很好,我将min更改为max以获得副本中的最后一行而不是第一行 (2认同)

Ada*_*son 32

我假设你的意思是你不关心哪一行来获得title,idcommentname值(你有"抢"的所有行,但我不知道那其实是东西会被强制执行或不在您的数据模型中).如果是这样,那么您可以使用窗口函数返回给定电子邮件地址的第一行:

select
    id,
    title,
    email,
    commentname

from
(
select 
    *, 
    row_number() over (partition by email order by id) as RowNbr 

from YourTable
) source

where RowNbr = 1
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的解决方案,因为它可以应用于没有唯一标识列或有唯一标识列的重复行。 (2认同)

Ram*_*Ram 6

如果您使用的是MySql 5.7或更高版本,根据这些链接(MySql官方SO QA),我们可以选择每一条记录group by,而不需要任何聚合函数。

所以查询可以简化为这样。

select * from comments_table group by commentname;

在这里尝试一下实际的查询

  • 尽管这是错误问题的正确答案,但我最终还是在这里寻找 mysql 的解决方案,所以采取我的 updoot (2认同)
  • 好的解决方案值得更多尊重 (2认同)