如何根据特定订单对结果进行分组?

时间:2017-06-24 17:42:12

标签: mysql group-by sql-order-by

我有一个VIEW,其中包含来自多个表的大量信息。在此VIEW中执行查询时,我需要通过列的值对结果进行分组。

我的主要问题是,当对结果进行分组时,我不需要按顺序进行分组。我注意到,在分组时,我的数据库最终得到它在指定列中找到的第一个不同记录,并忽略其余记录。

问题是,我需要包含分组词的最后一行。我已经尝试在进行分组之前进行排序,但即便如此,我的数据库引擎似乎也忽略了之前完成的排序。

使用下表作为我的观点的示例,这是我的问题:

我怎么知道哪个是角色注册每种颜色的最后日期?

也就是说,我需要所有的表列ORDER by DATE DESC和GROUP by COLOR。

+------+------------+-------+------------+
| id   | name       | color | date       |
+------+------------+-------+------------+
|    1 | SweetRobin | Green | 2017-01-01 |
|    2 | Tyrion     | Red   | 2017-02-01 |
|    3 | Sansa      | Grey  | 2017-03-01 |
|    4 | Ned        | Grey  | 2017-04-01 |
|    5 | Margaery   | Green | 2017-05-01 |
|    6 | Oberyn     | Red   | 2017-06-01 |
+------+------------+-------+------------+

根据我的经验,如果我使用

SELECT * FROM caracter GROUP BY color the output will be:
+------+------------+-------+------------+
| id   | name       | color | date       |
+------+------------+-------+------------+
|    1 | SweetRobin | Green | 2017-01-01 |
|    2 | Tyrion     | Red   | 2017-02-01 |
|    3 | Sansa      | Grey  | 2017-03-01 |
+------+------------+-------+------------+

但我真正需要的是:

+------+----------+-------+------------+
| id   | name     | color | date       |
+------+----------+-------+------------+
|    4 | Ned      | Grey  | 2017-04-01 |
|    5 | Margaery | Green | 2017-05-01 |
|    6 | Oberyn   | Red   | 2017-06-01 |
+------+----------+-------+------------+

1 个答案:

答案 0 :(得分:0)

如果我正确理解你想要做什么,你可以尝试

SELECT c.*
  FROM (
  SELECT color, MAX(date) date
    FROM caracter
   GROUP BY color
) q JOIN caracter c 
    ON q.color = c.color 
   AND q.date = c.date
 ORDER BY id

我们的想法是,您首先获取每种颜色的最大日期,然后再加入以获取所有其他列。

输出:

+------+----------+-------+------------+
| id   | name     | color | date       |
+------+----------+-------+------------+
|    4 | Ned      | Grey  | 2017-04-01 |
|    5 | Margaery | Green | 2017-05-01 |
|    6 | Oberyn   | Red   | 2017-06-01 |
+------+----------+-------+------------+

这是dbfiddle演示