在MySQL中使用join替代此子查询

时间:2011-07-20 12:19:01

标签: mysql sql join subquery

我有一个由以下结构和记录组成的表,我想要做的只是提取那些状态id为1或2的记录的orderid,我想要排除所有orderid = statusid = 3的orderid,问题是orderid 106同时具有状态1和3 ...... 我写了一个用于此目的的子查询..

select * 
from orders_status_history 
where orders_id NOT IN 
   (select orders_id 
    from orders_status_history 
    where orders_status_id = 3)

有没有其他方法可以不使用子查询,因为我听说它会妨碍性能。因为我的查询也可以返回数千行。

id    order-id    status-id
1     1            1
2     2            1
3     105          1
4     106          1
5     106          3
6     108          1
7     109          1
8     109          2

任何帮助或建议都将受到高度赞赏..谢谢提前..

2 个答案:

答案 0 :(得分:4)

您可以这样做:

SELECT  osh.*
FROM    orders_status_history osh
LEFT JOIN
        orders_status_history oshd
ON      oshd.orders_id = osh_orders_id
        AND oshd.orders_status_id = 3
WHERE   oshd.orders_id IS NULL

但是,如果您在order_status_history (orders_id, orders_status_id)上有索引,那么NOT IN查询就可以了。

您可能需要阅读此内容:

答案 1 :(得分:0)

我想知道为什么你使用子查询,而你可以使用以下查询

select orders_id from orders_status_history where orders_status_id <> 3

请试试这个,我希望有所帮助