SQL:只选择一行具有相同值的表

Posted

技术标签:

【中文标题】SQL:只选择一行具有相同值的表【英文标题】:SQL: Select only one row of table with same value 【发布时间】:2016-11-11 22:50:12 【问题描述】:

我对 sql 有点陌生,对于我的项目,我需要做一些数据库排序和过滤:

假设我的数据库如下所示:

==========================================
|  id       |       email        | name
==========================================
|   1       |  123@test.com      | John
|   2       |  234@test.com      | Peter
|   3       |  234@test.com      | Steward
|   4       |  123@test.com      | Ethan
|   5       |  542@test.com      | Bob
|   6       |  123@test.com      | Patrick
==========================================

我应该怎么做才能只返回具有相同电子邮件的最后一列:

==========================================
|  id       |       email        | name
==========================================
|   3       |  234@test.com      | Steward
|   5       |  542@test.com      | Bob
|   6       |  123@test.com      | Patrick
==========================================

提前致谢!

【问题讨论】:

正在使用什么 dbms? 【参考方案1】:

SQL 查询:

    SELECT * FROM test.test1  WHERE id IN (
  SELECT MAX(id) FROM test.test1 GROUP BY email
);

希望这能解决您的问题。谢谢。

【讨论】:

【参考方案2】:

在 SQL 中执行此操作的一种通用方法是使用 ANSI 标准 row_number() 函数:

select t.*
from (select t.*, row_number() over (partition by email order by id desc) as seqnum
      from t
     ) t
where seqnum = 1;

【讨论】:

【参考方案3】:

这里有一个更清晰的方法:

SELECT *
FROM table
ORDER BY email DESC
LIMIT 1;

【讨论】:

【参考方案4】:

您可以使用以下查询来获取每个 emailMAX id 值:

SELECT email, MAX(id)
FROM mytable
GROUP BY email

使用上面的查询作为派生表可以获得整条记录:

SELECT t1.*
FROM mytable AS t1
JOIN (
  SELECT email, MAX(id) AS id
  FROM mytable
  GROUP BY email 
) AS t2 ON t1.id = t2.id

【讨论】:

以上是关于SQL:只选择一行具有相同值的表的主要内容,如果未能解决你的问题,请参考以下文章

如何选择(所有)表 1 中的一行,该行具有与表 2 相同的另一行

SQL:如何为一列中具有重复值的每组行选择一行?

在 SQL 中选择具有唯一列值的行

SQL - 选择两列中具有相同值的行

从具有相同值的两个表中选择数据后结果重复

sql查询以选择两列中具有相同id但不同值的记录