Эксперты MySQL - нужна помощь с «пересечь» - PullRequest
2 голосов
/ 06 апреля 2010

Я знаю, что MySQL 5.x не поддерживает INTERSECT, но, похоже, это то, что мне нужно.

Таблица A: Продукты (p_id)

Таблица B: Prod_cats (cat_id) - информация о категории (имя, описание и т. Д.)

Таблица C: prod_2cats (p_id, cat_id) - много ко многим

prod_2cats содержит множество (1 или более) категорий, которые были назначены для Продуктов (A).

Выполнение запроса / фильтра (интерактивно для пользователя) и необходимость выбора среди нескольких категорий продуктов, отвечающих ВСЕМ критериям.

Ex: - 80 товаров, отнесенных к категории X - 50 товаров, отнесенных к категории Y - но только 10 продуктов (пересекаются) назначены ОБА кот X и кот Y

Этот sql работает для одной категории:

ВЫБРАТЬ * ИЗ ПРОДУКТОВ, ГДЕ p_show = 'Y' И p_id IN (ВЫБРАТЬ p_id ОТ prods_2cats КАК ПК, ГДЕ PC.cat_id = ". $ Cat_id."

<- $ cat_id - очищенная переменная, переданная из формы запроса. </p>

Кажется, я не могу найти способ сказать "дай мне пересечение кота А и кота В" и вернуть подмножество (10 записей, из моего примера)

Помощь!

Ответы [ 3 ]

2 голосов
/ 06 апреля 2010

Хм, я не уверен, что это лучший способ сделать это, но его можно легко добавить к уже существующему запросу:

SELECT *
FROM products
WHERE p_show='Y'
    AND p_id IN (SELECT p_id
                 FROM prods_2cats AS PC
                 WHERE PC.cat_id = $cat1_id)
    AND p_id IN (SELECT p_id
                 FROM prods_2cats AS PC2
                 WHERE PC2.cat_id = $cat2_id)
1 голос
/ 07 апреля 2010
SELECT *
FROM products
WHERE p_show='Y'
    AND p_id IN (SELECT p_id
                 FROM prods_2cats AS PC
                 WHERE PC.cat_id in ($cat1_id, $cat2_id ))

ИЛИ еще лучше

SELECT p.*
FROM products p INNER JOIN prods_2cats AS PC on p.p_id = PC.p_id
WHERE p_show='Y' and C.cat_id in ($cat1_id, $cat2_id )

Надеюсь, это поможет

1 голос
/ 06 апреля 2010

Применить определение пересечения из теории множеств. Таким образом, если X пересекает Y, задает множество Z, то для каждого x в Z он считает, что x находится в X, а x находится в Y.

Что-то вроде

SELECT * FROM products WHERE p_show='Y' AND p_id IN 
( SELECT p_id FROM prods_2cats AS PC WHERE PC.cat_id =X) AND p_id IN
( SELECT p_id FROM prods_2cats AS PC WHERE PC.cat_id =Y)
...