我们有一个表格如下,其中包含订单状态:
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不允许这样做。 有没有其他方法可以解决这个问题?
答案 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`