我知道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个记录,来自我的例子)
帮助!
答案 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 )
希望这有帮助