【问题标题】:Select Unique Rows Based on Single Distinct Column - MySQL基于单个不同列选择唯一行 - MySQL
【发布时间】:2019-01-18 10:35:39
【问题描述】:

我想选择具有不同电子邮件的行,请参见下面的示例表:

表名 = 用户

 +----+---------+-------------------+-------------+
   | 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        |
   +----+---------+-------------------+-------------+

期望的结果是:

 +----+-------+-------------------+-------------+
   | id | title | email             | commentname |
   +----+-------+-------------------+-------------+
   |  5 | its ok| rob@hotmail.com   | rob         |
   |  7 | nice! | simon@hotmail.com | simon       |
   |  8 | yeah  | john@hotmail.com  | john        |
   +----+-------+-------------------+-------------+

不同的值应该是表示例id = 6 中的最新条目 所需的 SQL 是什么?

【问题讨论】:

  • 最新行不是id = 6吗?
  • 我的错应该是6

标签: mysql


【解决方案1】:

如果您使用的是 MySQL 5.7 或更早版本,那么您可以将您的表加入到子查询中,该子查询会找到每封电子邮件的最新记录:

SELECT t1.id, t1.title, t1.email, t1.commentname
FROM yourTable t1
INNER JOIN
(
    SELECT email, MAX(id) AS latest_id
    FROM yourTable
    GROUP BY email
) t2
    ON t1.email = t2.email AND t1.id = t2.latest_id;

如果您使用的是 MySQL 8+,那么只需在此处使用 ROW_NUMBER

WITH cte AS (
    SELECT id, title, email, commentname,
        ROW_NUMBER() OVER (PARTITION BY email ORDER BY id DESC) rn
    FROM yourTable
)

SELECT id, title, email, commentname
FROM cte
WHERE rn = 1;

注意:您的预期输出可能有问题,id = 6 记录是 rob@hotmail.com 的最新记录。

【讨论】:

  • 不错 :) 我建议您在第二次查询时按 ID 排序(经过测试,结果排序,例如 id 为 8、6、7)
【解决方案2】:

您可以使用相关子查询在下面尝试

select * from table1 a
where id in (select max(id) from table1 b where a.email=b.email group by b.email)

【讨论】:

    【解决方案3】:

    如果 'id' 是唯一的或主键,你可以使用这个:

    select * from Users where id in (select max(id) from Users group by commentname)
    

    以上一个会提高您的数据库性能,因为correlated subqueries 来自这样一个事实,即子查询使用来自外部查询的信息,并且子查询对外部查询中的每一行执行一次。所以,我建议您使用我的答案如果“id”是唯一的。

    【讨论】:

      猜你喜欢
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      相关资源
      最近更新 更多