选择带MAX的查询

时间:2010-02-09 15:48:50

标签: php select mysql

我遇到了一个很大的问题,我整天都在努力,没有找到任何解决方案。希望你能帮帮我吗?

我有两张桌子:

第一个名为“订单”:

orders_id | orders_date | .....
1           xxxxxxxxxx
2           xxxxxxxxxx
3           xxxxxxxxxx

第二个是“orders_history”:

orders_id | order_status_id | date_added
1           1                 2009-10-01
1           2                 2010-01-01
2           1                 2010-02-01
3           1                 2010-02-01

所以现在我希望所有订单都在order_status_id ='1'

我已尝试使用MAX,HAVING,GROUP BY,......也可以选择子选项,但我还没有找到任何解决方案。我知道这不是很难,但我已经完成了...... 它是这样的:

SELECT orders.*, orders_history.* FROM orders, orders_history WHERE orders_history.order_status_id <= '1'

但是我也得到订单,订单为order_id 1

希望你能提供帮助。谢谢!

的Sascha

为了进一步澄清,海报的'orders_history'表记录了所有订单的状态。目标是一个查询,它将查找当前订单状态为1的所有订单。订单ID#1当前的状态为2,因此不应包含在结果中。

可能,订单状态随着时间的推移而上升并且永远不会下降,因此订单状态和date_added将不断增加。

4 个答案:

答案 0 :(得分:3)

这应该适合你:

SELECT * 
FROM orders
   , orders_history
WHERE orders.orders_id = orders_history.orders_id
AND orders.orders_id IN (
  SELECT orders_id 
    FROM orders_history
   GROUP BY orders_id
   HAVING MAX(order_status_id) = 1
)

答案 1 :(得分:2)

我不会感到惊讶你无法让它工作 - 这是一个非常棘手的查询类型,你必须'GROUP BY'并找到MAX以及同一行中的所有其他相应值。这是一个常见的请求,人们常常惊讶于在SQL中表达它实际上非常困难。这是在MySQL中实现它的一种方法:

SELECT T2.orders_id FROM (
    SELECT orders_id, MAX(date_added) AS date_added
    FROM orders_history
    GROUP BY orders_id
) AS T1
JOIN orders_history T2
ON T1.orders_id = T2.orders_id AND T1.date_added = T2.date_added
GROUP BY T2.orders_id, T2.date_added
HAVING MAX(order_status_id) = 1

我假设:

  • orders_id,date_added不是唯一的。
  • orders_id,date_added,order_status_id是唯一的。

如果不是第二个假设不成立,则在第一个SELECT之后添加DISTINCT。

以下是我获得的测试数据的结果:

2
3

如果您想获取有关每个订单的额外信息,可以将此商品加入订单表。

答案 2 :(得分:1)

在评论中讨论后,

编辑(更改了where子句):

SELECT orders.*, orders_history.* 
FROM orders INNER JOIN orders_history
 ON orders.orders_id = orders_history.orders_id 
WHERE orders.orders_id IN 
   (SELECT orders_id FROM orders_history 
   GROUP BY orders_id 
   HAVING MAX(order_status_id) = 1)

答案 3 :(得分:0)

select o.*, oh.* 
from orders o
inner join orders_history oh on oh.orders_id = o.orders_id
where oh_orders_status = 1

应该做的伎俩。自从我触摸mysql以来已经有一段时间了,所以我不知道你的orders_status是否应该在引号中 - 我猜它不是一个int ...