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

在MySQL中使用join代替此子查询,mysql,sql,join,subquery,Mysql,Sql,Join,Subquery,我有一个由以下结构和记录组成的表,我只想提取状态id为1或2的记录的orderid,我想排除所有状态id为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

我有一个由以下结构和记录组成的表,我只想提取状态id为1或2的记录的orderid,我想排除所有状态id为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
我们将非常感谢您的任何帮助或建议。请提前感谢。

您可以这样做:

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\u status\u history(orders\u id,orders\u status\u id)
上有一个索引,那么
NOT IN
查询也可以

您可能需要阅读以下内容:


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

select orders_id from orders_status_history where orders_status_id <> 3
从订单\u状态\u历史记录中选择订单\u id,其中订单\u状态\u id 3

请尝试此操作,我希望它对Thnx有所帮助,但它不起作用,因为它返回所有记录,除了statusid为3的记录,但有一条记录同时具有statusid,即106同时具有1和3……尝试连接两个表
从osh1上的订单状态历史osh1加入订单状态历史osh2中选择osh1.orders\U id=osh2.orders\U id,其中订单状态\U id 3Thnx很多先生。。它帮了我的忙。。。我只能说Thnx Thnx Thnx Thnx