MySQL присоединяется - как найти всех детей, которые принадлежат ВСЕМ родителям - PullRequest
0 голосов
/ 27 марта 2012

У меня есть три таблицы mysql

items
===========
id    title

items_in_categories
============================
id    item_id    category_id

categories
===========
id    title

Я хочу найти все предметы, которые относятся к ALL заявленным категориям.Не какой-то одной категории, но ВСЕ категории

Например, если я хочу найти все элементы, которые принадлежат к категории ID 3 и 5

нет.из возможных категорий для поиска может доходить до целых 20.

Например, я хочу получить все элементы, которые относятся к категории с идентификаторами 1, 2, 3, 4, 5, 6, .... и 20

Я хотел бы использовать как можно более простой способ.

Я пробовал AND и вложенное NOT EXISTS, как указано в руководстве по mysql.

Nothingработал.

ОБНОВЛЕНИЕ: Я придумал это.

select * from 
    (select count(*) as counter, item_id from items_in_categories 
        where category_id in (3, 5) group by item_id)getall 
where counter = 2

Есть ли лучший способ?

Ответы [ 3 ]

1 голос
/ 27 марта 2012

Я знаю, что это может быть переназначено и помещено в один запрос (Вы можете вкладывать счетчик категорий внутри объекта вместо отдельного запроса ... Я просто думаю, что это более читабельно), но вот мой взгляд на это :

DECLARE @CategoryCount INT;

SELECT @CategoryCount = COUNT(DISTINCT id) AS CategoryCount
FROM categories
WHERE category_id IN (3,5);

SELECT *
FROM items
WHERE item_id IN 
(
    SELECT item_id
    FROM items_in_categories
    WHERE items_in_categories.category_id IN (3,5)
    GROUP BY item_id
    HAVING COUNT(DISTINCT category_id) = @CategoryCount
)
0 голосов
/ 27 марта 2012
select * from items i , items_in_categories iic, categories c where i.id = iic.item_id and iic.category_id = c.id and c.id in(select * from category where id in(3,5))

если вы не получаете отдельный элемент из вышеуказанного запроса, вы можете добавить DISTINCT для идентификатора элемента.

0 голосов
/ 27 марта 2012

Вы можете сделать это, используя предложение «IN», например:

SELECT i.* 
FROM items i
WHERE i.id IN (SELECT item_id from items_in_categories where category_id IN (3,5))
...