根据一个字段从多行中选择一行

时间:2016-04-17 03:42:36

标签: mysql

这个问题我有一个相关的表格,奖励:

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

2 个答案:

答案 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中,那么您的条目将是nameURL的唯一组合(然后您就不会#39; t获得最大点值。)

下一步是基本上加入此临时表以获取award表中匹配的行。

INNER JOIN (...) AS t2
    ON t1.name=t2.name
       AND t1.point=t2.point;

联接查找award表中namepoint匹配namepoint的子查询结果中的行。这为我们提供了我们想要的完整行 - 现在我们可以访问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