Использование соединения вместо этого подзапроса в MySQL - PullRequest
2 голосов
/ 20 июля 2011

У меня есть таблица со следующей структурой и записями, все, что я хочу сделать, это просто извлечь orderid из тех записей, чей статус ID равен 1 или 2, я хочу исключить все orderid с statusid = 3, проблема в том,что 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 ]

4 голосов
/ 20 июля 2011

Вы можете сделать это:

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 также хорош.

Возможно, вы захотитеПрочитайте это:

0 голосов
/ 20 июля 2011

Интересно, почему вы используете подзапрос, в то время как вы можете использовать следующий запрос

select orders_id from orders_status_history where orders_status_id <> 3

Пожалуйста, попробуйте это, и я надеюсь, что это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...