选择不同的列以及MySQL中的其他列

时间:2011-12-18 13:56:45

标签: mysql select distinct

我似乎无法为以下(可能是一个古老的)问题找到合适的解决方案,所以希望有人可以解决问题。我需要在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

正如你所看到的,詹姆斯和德克兰有不同的评级,但名字相同,所以他们只返回一次。

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

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

3 个答案:

答案 0 :(得分:24)

使用子查询,您可以获得每个名称的最高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

答案 1 :(得分:3)

您可以执行group by

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

答案 2 :(得分:2)

我同意@rcdmk。使用DEPENDENT子查询可以消除性能,GROUP BY似乎更合适,只要您已经索引 country 字段并且只有几行将到达服务器。通过@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