2017-02-20 28 views
2

У меня есть два столбца product_id и category_id. Я хочу выбрать все product_id, которые не имеют category_id = 90Выберите SQL, где значение не существует

Я использую этот запрос, но он возвращает null. Что я делаю не так?

SELECT * 
FROM `oc_product_to_category` 
WHERE NOT EXISTS (
    SELECT * 
    FROM `oc_product_to_category` 
    WHERE category_id = 90 
) 
+0

'SELECT * FROM oc_product_to_category где category_id <> 90' –

ответ

3

Вы не коррелируете внутренние и внешние запросы. Если есть хотя бы один продукт с category_id = 90, внутренний запрос вернет некоторые строки, и поэтому условие NOT EXISTS всегда будет ложным, а внешний запрос не будет возвращать строки. Вам нужно добавить условие, чтобы указать внутренний запрос и внешний запрос относятся к одному продукту:

SELECT * 
FROM `oc_product_to_category` a 
WHERE NOT EXISTS (
    SELECT * 
    FROM `oc_product_to_category` b 
    WHERE category_id = 90 AND 
     a.product_id = b.product_id -- Here! 
) 
+0

Спасибо Mureinik, но я получаю эту ошибку .. # 1054 - Неизвестный столбец «oc_product_to_category.product_id» в разделе «предложение» .. любая идея? –

+0

Я использую псевдонимы ('a' и' b'), чтобы отличать 'oc_product_to_category' во внутреннем запросе от внешнего запроса. Вы также должны использовать эти псевдонимы в разделе 'order by' (т. Е.' Order by a.product_id'). – Mureinik

+0

Спасибо! он отлично поработал после добавления «order by a.product_id» –

1

Вы можете запросить oc_product таблицу и проверить продукты, которые не имеют соответствующей записи в таблице oc_product_to_category с category_id равным 90.

SELECT * 
FROM `oc_product` 
WHERE product_id NOT IN 
    (SELECT product_id 
    FROM `oc_product_to_category` 
    WHERE category_id = 90) 
+0

Это будет также возвращают продукты с более чем одной категорией, одна из которых - 90. Я не думаю, что это то, что происходит после OP. – Mureinik

+0

Спасибо, я думаю, что вы были правы - ответьте на обновления :) – dana

1

Try This

SELECT * 
FROM `oc_product_to_category` 
WHERE category_id <> **90** 
+0

Это также вернет продукты с более чем одной категорией, одна из которых - 90. Я не думаю, что это то, что происходит после OP. – Mureinik

+0

Принимая во внимание, что каждый продукт относится только к одной категории. Anyways thanks :) – Rahul

1

попробуйте следующее:

SELECT * 
FROM `oc_product_to_category` 
WHERE category_id <> 90 
+0

Это также вернет продукты, которые имеют более одной категории, одна из которых - 90. Я не думаю, что это то, что происходит после OP. – Mureinik

0

SELECT * ОТ oc_product_to_category ГДЕ category_id <> 90;

+0

Это также возвращает продукты, которые имеют более одной категории, одна из которых - 90. Я не думаю, что это то, что происходит после OP. – Mureinik

0

Попробуйте

SELECT * 
FROM your_Name 
WHERE category_id NOT LIKE '90' 
+0

Спасибо, но это только, кажется, исключает те, которые имеют category_id = 90, а не показывают, какие из них отсутствуют category_id = 90. –

1
SELECT * 
FROM `oc_product_to_category` where product_id NOT IN (SELECT product_id 
FROM `oc_product_to_category where category_id = 90) 
0

Try:

SELECT * 
FROM oc_product_to_category 
WHERE category_id not in ('90') 
1

ваш запрос должен быть таким, как это

SELECT * 
FROM `oc_product_to_category` m 
WHERE NOT EXISTS (
SELECT * 
FROM `oc_product_to_category` 
WHERE m.category_id = 90 
) 

вы можете получить много способов эти результаты как

SELECT * 
FROM `oc_product_to_category` 
WHERE category_id <> 90 




SELECT * 
FROM `oc_product_to_category` 
WHERE category_id != 90 


SELECT * 
FROM `oc_product_to_category` 
having category_id <> 90 



SELECT * 
FROM `oc_product_to_category` 
WHERE category_id NOT IN 
(SELECT * 
FROM `oc_product_to_category` 
WHERE category_id = 90) 
0

Попробуйте

SELECT * FROM oc_product_to_category where category_id != 90 

(ИЛИ)

SELECT * FROM oc_product_to_category where category_id <> 90