2015-05-20 6 views
1

У меня есть таблица Products и таблица Orders, определенная таким образом, что я могу сделать запрос JOIN следующим образом, чтобы возвращать продукты с нулевыми заказами для определенного пользователя.mysql запрос для извлечения всех продуктов без заказов для пользователя

Этот запрос работает, но очень медленный.

select * from products where id not in (select product_id from orders where user_id = 1) 

Вопрос в том, как написать тот же запрос лучше и быстрее?

+0

Вы не можете сделать это 2 запроса, а затем взять первые результаты запроса во втором запросе и посмотреть время? –

ответ

1

Нет необходимости подзапроса для этого:

SELECT p.product_id 
FROM 
    Products p 
    LEFT JOIN Order o ON p.product_id = o.product_id AND o.user_id = @UserId 
WHERE 
    o.order_id IS NULL -- or any other field that cannot be null on Order 

EDIT: Для повышения производительности вы можете проверить, как хорошо, что у вас есть индексы на месте в столбце user_id Order и на ваших идентификаторах (скорее всего, вы их там и, вероятно, сгруппированные индексы, стоит проверить)

+0

работал быстро спасибо – user828061

+0

Первоначальный запрос возвращает все столбцы, а не только product_id. Но если целью является оптимизация запроса, то разумно спросить себя, если нам действительно нужны все столбцы ... – mcoolive

+0

@mcoolive да, и на самом деле DISTINCT не требуется, поскольку мы получаем только продукты, не соответствующие любому заказу, который будет иметь только одно значение в «стороне продукта» запроса. Поскольку вопрос был просто «получить продукты, которые ...», я предположил, что идентификатора будет более чем достаточно. – Juan

1

Вы должны быть в состоянии сделать простой LEFT JOIN

SELET * FROM products 
LEFT JOIN orders ON (orders.product_id=products.id and orders.user_id=1) 
WHERE orders.id IS NULL; 
0
SELECT P.* 
FROM products P 
LEFT JOIN (SELECT product_id from orders where user_id = 1) O 
ON P.id = O.product_id 
WHERE O.product_id IS NULL 
Смежные вопросы