【问题标题】:Select distinct column along with some other columns in MySQL选择不同的列以及 MySQL 中的其他一些列
【发布时间】:2012-01-23 01:03:07
【问题描述】:

我似乎无法为以下(可能是一个古老的)问题找到合适的解决方案,因此希望有人能提供一些启示。我需要在 mySQL 中返回 1 个不同的列以及其他非不同的列。

我在 mySQL 中有下表:

id      name       destination     rating     country
----------------------------------------------------
1       James      Barbados        5          WI
2       Andrew     Antigua         6          WI
3       James      Barbados        3          WI
4       Declan     Trinidad        2          WI
5       Steve      Barbados        4          WI
6       Declan     Trinidad        3          WI

我希望 SQL 语句返回 DISTINCT 名称以及目的地,基于国家/地区的评级。

id      name       destination     rating     country
----------------------------------------------------
1       James      Barbados        5          WI
2       Andrew     Antigua         6          WI
4       Declan     Trinidad        2          WI
5       Steve      Barbados        4          WI

如您所见,James 和 Declan 的评分不同,但名称相同,因此它们只返回一次。

以下查询返回所有行,因为评级不同。无论如何我可以返回上述结果集吗?

SELECT (distinct name), destination, rating 
  FROM table 
 WHERE country = 'WI' 
 ORDER BY id

【问题讨论】:

    标签: mysql select distinct


    【解决方案1】:

    使用子查询,您可以获得每个名称的最高 id,然后根据该名称选择其余行:

    SELECT * FROM table
    WHERE id IN (
      SELECT MAX(id) FROM table GROUP BY name
    )
    

    如果您愿意,可以使用 MIN(id) 获取每个名称的第一条记录,而不是最后一条。

    也可以对子查询使用INNER JOIN。为此,性能应该相似,有时您需要连接子查询中的 两个 列。

    SELECT
      table.*
    FROM 
      table
      INNER JOIN (
        SELECT MAX(id) AS id FROM table GROUP BY name
      ) maxid ON table.id = maxid.id
    

    【讨论】:

    • 正如这里stackoverflow.com/a/13617822/2126442 所暗示的那样,如果您需要有多个“不同”的列,则可以多次分组:SELECT name, destination, MAX(id) AS id FROM table GROUP BY name, destination;(或由SELECT * FROM table WHERE id IN (…) 包装)。
    【解决方案2】:

    问题是 distinct 作用于整个返回集,而不仅仅是第一个字段。否则 MySQL 将不知道要返回什么记录。因此,您希望在评级上有某种分组函数,无论是 MAX、MIN、GROUP_CONCAT、AVG 还是其他几个函数。

    Michael 已经发布了一个很好的答案,所以我不打算重新编写查询。

    【讨论】:

      【解决方案3】:

      你可以做一个group by:

      select min(id) as id, name, destination, avg(rating) as rating, country from TABLE_NAME group by name, destination, country
      

      【讨论】:

        【解决方案4】:

        我同意@rcdmk。使用 DEPENDENT 子查询会降低性能,如果您已经对 country 字段进行了索引,并且只有几行将到达服务器,则 GROUP BY 似乎更合适。通过 @rcdmk 重写查询 giben,我添加了 ORDER BY NULL 子句来抑制 GROUP BY 的隐式排序,以使其更快一点:

        SELECT MIN(id) as id, name, destination as rating, country 
        FROM table WHERE country = 'WI' 
        GROUP BY name, destination ORDER BY NULL
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-17
          • 2011-12-24
          • 1970-01-01
          • 2014-04-06
          • 1970-01-01
          • 1970-01-01
          • 2018-09-24
          • 2011-04-29
          相关资源
          最近更新 更多