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