我遇到了一个很大的问题,我整天都在努力,没有找到任何解决方案。希望你能帮帮我吗?
我有两张桌子:
第一个名为“订单”:
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将不断增加。
答案 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
我假设:
如果不是第二个假设不成立,则在第一个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 ...