|
|
|
| Есть 3 таблицы, у одного товара (таблица content) может быть несколько категорий,
Нужно выбрать все товары кроме товаров с категорий с именем 'Apple' и 'Banana', те
если у товара есть хоть одна из этих категорий он не должен выбираться.
Таблицы:
content('record_num')
content_category('content_id', 'cat_id')
category('name', 'cat_id');
|
Делаю так
SELECT c.record_num FROM content c
LEFT JOIN content_category cc
ON c.record_num = cc.content_id
LEFT JOIN category cat
ON cc.cat_id = cat.id
where cat.name !='Apple' and cat.name !='Banana';
|
но этот вариант работает не корректно. | |
|
|
|
|
|
|
|
для: asker
(08.11.2013 в 12:48)
| | А почему тогда LEFT JOIN используете, а не просто JOIN? Если нужно избавиться от повторов, то сгруппируйте результаты при помощи GROUP BY. Кроме того, вы не обязаны соединять чистые таблицы, можете отсечь не нужные вам категории при помощи вложенного запроса (правда, в этом случае не получится воспользоваться индексами, которые бывают очень кстати в таких запросах).
Можно начать отталкиваться от следующего запроса (проверить не могу, так как нет вашей базы данных)
SELECT
c.record_num
FROM
content c
JOIN
content_category cc
ON
c.record_num = cc.content_id
JOIN
(SELECT id FROM category WHERE name !='Apple' and name !='Banana') cat
ON cc.cat_id = cat.id;
|
| |
|
|
|
|
|
|
|
для: asker
(08.11.2013 в 12:48)
| |
SELECT * FROM content cn
LEFT JOIN content_category cc ON cn.content_id = cc.content_id
LEFT JOIN category ca ON ca.cat_id = cc.cat_id AND ca.name IN ('Apple', 'Banana')
WHERE cn.record_num IS NULL
|
| |
|
|
|