mySQL专家 - 需要'相交'的帮助

时间:2010-04-05 20:46:29

标签: mysql select union intersect

我知道mySQL 5.x不支持INTERSECT,但这似乎是我需要的。

表A:产品(p_id)

表B:Prod_cats(cat_id) - 类别信息(名称,描述等)

表C:prod_2cats(p_id,cat_id) - 多对多

prod_2cats包含已分配给产品(A)的多个(1个或多个)类别。

进行查询/过滤查找(用户互动),并且需要能够在多个类别中选择符合所有条件的产品。

例: - 分配给X类的80种产品 - 分配到Y类的50种产品 - 但是只有10个产品(交叉)被分配给两只猫X和猫Y

这个sql适用于一个类别:

SELECT * FROM products WHERE p_show ='Y'AND p_id IN(SELECT p_id FROM prods_2cats AS PC WHERE PC.cat_id =“。$ cat_id。”

< - $ cat_id是从查询表单传递的已清理的var。

我似乎无法找到说'给我猫A和猫B的交叉'的方法并取回子集(10个记录,来自我的例子)

帮助!

3 个答案:

答案 0 :(得分:2)

嗯,我不确定这是最好的方法,但它可以很容易地添加到你已经存在的查询中:

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 :(得分:1)

应用集合论的交集定义。因此,如果X与Y相交给出集合Z,那么对于Z中的每个x,它认为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)

答案 2 :(得分:1)

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 )

希望这有帮助