选择组的最大值

时间:2014-10-03 09:43:48

标签: mysql group-by

我们有一个表格如下,其中包含订单状态:

history
---------------------------------
order_id    status    date
  25         1        2014-10-01
  25         3        2014-10-02
  26         1        2014-10-01
  27         2        2014-10-01
  26         4        2014-10-03

我需要选择具有指定状态的列的order_id,但它必须是最新状态。 这可以通过按功能分组来实现:

SELECT status, order_id, MAX(date) 
FROM history GROUP BY order_id HAVING status = 4 OR status = 2

但这不适合我,因为我只想要order_id,因为这是子查询的一部分(SELECT ... WHERE order_id IN([上面的查询]))。但是,MySQL不允许这样做。 有没有其他方法可以解决这个问题?

2 个答案:

答案 0 :(得分:0)

这个问题是标准的groupwise max问题的变体,在这里和其他地方广泛讨论过 - 甚至在mysql手册中都有自己专门的章节。

对标准问题的标准回应是使用不相关的子查询,如下所示......

SELECT x.* 
  FROM history x 
  JOIN  
     ( SELECT order_id, MAX(date) max_date FROM history GROUP BY order_id ) y 
    ON y.order_id = x.order_id 
   AND y.max_date = x.date;

由于额外的要求,您的问题似乎更复杂。然而,这是一个红鲱鱼。那么使用这种方法的正确答案如下......

SELECT x.* 
  FROM history x 
  JOIN  
     ( SELECT order_id, MAX(date) max_date FROM history GROUP BY order_id ) y 
    ON y.order_id = x.order_id 
   AND y.max_date = x.date 
 WHERE status IN (2,4);

答案 1 :(得分:-1)

使用SELF JOIN

SELECT h1.`order_id` FROM `history` h1
LEFT JOIN `history` h2 
ON (h1.`order_id`= h2.`order_id` AND h1.`status` > h2.`status`)
-- WHERE h1.status IN (1,2,3) < -- here you can use your status condition
GROUP BY h1.`order_id`

Reference