我陷入了一个应该非常简单的案例,但我不能用连接来解决这个问题:(假设我有3个包含订单,订单状态和州名称的表,它们通过订单ID和状态ID链接。
表1,订单:id_order,number,customer_name,fk_state
表2包含订单历史记录: fk_order,fk_old_order_state,fk_new_order_state,new_state_date
表3包含州名: id_state,state_name
id_state只是1到20之间每个州的唯一编号,没有州名称就没有意义。我希望得到一张表格,我可以看到状态为“已取消”的所有订单的新旧州名(不是ids!),以便查看订单被取消的阶段。所以我需要一个包含以下数据的表: order.number,旧状态的名称,新状态的名称,新状态的日期。
很容易获得旧状态和新状态的ID,甚至是列中第一个状态的名称,但我不知道如何为新旧状态提取1个表状态名称。
我有更多类似的任务,所以如果你帮我解决这个问题会更好,我能理解这个想法。 感谢
答案 0 :(得分:2)
select
o.id_order,
o.number,
o.customer_name,
oh.new_state_date,
sno.state_name as old_state_name
from order_history as oh
inner join orders as o on o.id_order = oh.fk_order
inner join state_names as snn on snn.id_state = oh.fk_new_order_state
left outer join state_names as sno on sno.id_state = oh.fk_old_order_state
where snn.state_name = 'canceled'
答案 1 :(得分:2)
您只需要加入表3(带有州名)两次。一次为旧状态,一次为新状态。因此,使用表别名来确保没有冲突是很重要的(下面我使用os表示旧状态,ns表示新状态)
SELECT o.number,
os.state_name AS old_state_name,
ns.state_name AS new_state_name,
oh.new_state_date
FROM orders o
INNER JOIN order_History oh
ON o.id_order = oh.fk_order
INNER JOIN state_names os
ON os.id_state = oh.fk_old_order_state
INNER JOIN state_names ns
ON ns.id_state = oh.fk_new_order_state;