2012-01-11 37 views
1

我将如何返回与查询结果相关的所有类别ID?根据结果消除空的类别?

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 

在下面的查询我得到的所有产品ID的包含CATEGORY_ID 3和CATEGORY_ID 7
但我也想知道这CATEGORY_ID的(选择)仍然有producs_id对选择的基础:

例如我喜欢返回(基于代码示例)该查询:
-product_id = 2
-category_id的:7,3,4,1

当使用此我可能会喜欢limet查询为每页最多项目。

代码我; VE这么远:

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 

问题在猫ID的宽松查询:

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'列? – 2012-01-11 12:54:22

+0

是一个错误将它改为它应该是的 – Hank12312 2012-01-11 14:03:14

回答

1

我确定还有其他方法可以做到这一点,但这里是一个。

首先,我们需要找出哪些product_id小号我们感兴趣的是你可以指望有多少所需的类别当中的每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. 

因此,这里有所有我们想要的category_id S为product_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 2012-01-11 14:02:28

+0

不幸的是,我不知道关于数据库设计模型的任何性能:( – 2012-01-11 23:16:21