这个问题我有一个相关的表格,奖励:
----------------------------------------
| award |
----------------------------------------
| id | name | URL | country_id | point |
----------------------------------------
1 | A | a | 1 | 120
2 | A | b | 0 | 60
3 | A | b | 2 | 80
4 | B | c | 0 | 50
5 | B | d | 1 | 70
我希望能够获得给定国家/地区的列表,相应的不同奖项(相同的奖项具有相同的名称)以及point
列的最高值。
所以我尝试通过点DESC命令我的请求,并按名称分组,但它没有做到这一点,我没有得到正确数量的点数,也没有正确的URL。
我知道我可以通过从表中获取所有数据然后只保留具有最佳点数的行来轻松地做到这一点,但是必须有一种方法只能使用SQL!
我试过的请求是:
SELECT name, URL, point FROM award WHERE country_id IN (0,1) ORDER BY point DESC GROUP BY name
答案 0 :(得分:0)
这可以帮到你找到你想要的东西:
SELECT t1.* FROM award AS t1
INNER JOIN (SELECT name, MAX(point) AS point
FROM award
WHERE country_id IN (0,1)
GROUP BY name) AS t2
ON t1.name=t2.name
AND t1.point=t2.point;
以下是它如何分解:
这是将award
表(标识为t1
)加入一个标识为t2
的子查询。子查询看起来像这样:
SELECT name, MAX(point) AS point
FROM award
WHERE country_id IN (0,1)
GROUP BY name
子查询将返回每个名称的最大点数。以下是子查询的结果:
+------+-------+
| name | point |
+------+-------+
| A | 120 |
| B | 70 |
+------+-------+
显然,这并不包括URL
。如果确实如此,URL
必须在GROUP BY
中,那么您的条目将是name
和URL
的唯一组合(然后您就不会#39; t获得最大点值。)
下一步是基本上加入此临时表以获取award
表中匹配的行。
INNER JOIN (...) AS t2
ON t1.name=t2.name
AND t1.point=t2.point;
联接查找award
表中name
和point
匹配name
和point
的子查询结果中的行。这为我们提供了我们想要的完整行 - 现在我们可以访问URL
。结果如下:
+------+------+------+------------+-------+
| id | name | URL | country_id | point |
+------+------+------+------------+-------+
| 1 | A | a | 1 | 120 |
| 5 | B | d | 1 | 70 |
+------+------+------+------------+-------+
此外,此时您可以按所需的award
表格中的列进行排序,例如名称:
ORDER BY t1.name
或最高点值:
ORDER BY t1.point DESC
答案 1 :(得分:0)
如果你想要点desc,试试吧
SELECT name, country_id, point
FROM `award`
WHERE country_id IN (0,1)
GROUP BY name, country_id
ORDER BY name, point DESC
结果
name |country_id |point
=====|============|===========
A |1 |120
A |0 |60
B |1 |70
B |0 |50