2012-01-11 4 views
1

Как вернуть все идентификаторы категории, связанные с результатом запроса?Удалить пустые категории по результатам?

items_cats: (many to many) 
product_id | category_id 
==================== 
1   | 1 
1   | 2 
1   | 4 
1   | 7 

2   | 1 
2   | 3 
2   | 4 
2   | 7 

3   | 1 
3   | 3 
3   | 4 
3   | 8 

В запросе ниже я получаю все идентификатор продукта, которые содержат CATEGORY_ID 3 и CATEGORY_ID 7.
Но я также хотел бы знать, какие category_id (в опции) еще producs_id базовому на выбор:

Например, я люблю этот запрос, чтобы вернуться (на основании примера кода):
-product_id = 2
-category_id-х: 7, 3, 4, 1

При использовании этого я, вероятно, хотел бы Лиму запроса для максимального количества элементов на странице.

код, который я, ве получил до сих пор:

SELECT 
     DISTINCT t1.product_id, t1.category_id 
    FROM 
     items_cats t1 
    INNER JOIN 
     items_cats t1b 
     ON t1.product_id =t1b.product_id 
    WHERE 
     t1.category_id=3 AND 
     t1b.category_id=7 

Проблема в свободном запросе для кошки идентификаторами:

SELECT 
     e1.category_id 
    FROM 
     drinks_ingredients e1  
    WHERE 
     e1.category_id=2 

Конечно Он возвращает 2, но мне нравится это вернуть 1, 2, 4, 7.

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

SELECT DISTINCT 
     t1.category_id 
    FROM items_cats t1 
    WHERE t1.product_id = 2 
+0

Что такое 'iid' колонка? –

+0

была ошибкой, изменила ее на то, что должно быть – Hank12312

ответ

1

Я уверен, что есть другие способы сделать это, но вот один.

Во-первых, мы должны работать, какие product_id s мы заинтересованы в Вы можете подсчитать, сколько из требуемых категорий каждый product_id находится в:.

SELECT product_id, count(category_id) as numcats 
FROM items_cats 
WHERE category_id IN (3,7) 
GROUP BY product_id; 
+------------+---------+ 
| product_id | numcats | 
+------------+---------+ 
|   1 |  1 | 
|   2 |  2 | 
|   3 |  1 | 
+------------+---------+ 

Поскольку мы определили два category_id (3 и 7), нас интересует только product_id, где count(category_id) = 2. Так что добавьте HAVING numcats=2 до конца:

SELECT product_id, COUNT(category_id) as numcats 
FROM items_cats 
WHERE category_id IN (3,7) 
GROUP BY product_id 
HAVING numcats=2; 
# (returns all product_id with both category_id=3 and 7. 

Так вот все product_id s мы хотим category_id с для. Тогда мы просто выбрать все category_id где product_id находится в предыдущей таблице:

SELECT DISTINCT category_id 
FROM items_cats 
WHERE product_id IN 
    (SELECT product_id 
    FROM items_cats 
    WHERE category_id IN (3,7) 
    GROUP BY product_id 
    HAVING COUNT(category_id)=2); 

+-------------+ 
| category_id | 
+-------------+ 
|   1 | 
|   3 | 
|   4 | 
|   7 | 
+-------------+ 
+0

Танк для вашего решения. Я прошел тест производительности. Вы думаете, что использование вложенного набора db-дизайна ускорит время запроса для этого случая? – Hank12312

+0

К сожалению, я ничего не знаю о моделях дизайна баз данных с точки зрения производительности :( –

Смежные вопросы