2010-04-05 72 views
2

我知道mySQL 5.x不支持INTERSECT,但这似乎是我需要的。mySQL专家 - 需要与'intersect'的帮助

表A:产品(P_ID)

表B:Prod_cats(CAT_ID) - 类别信息(名称,说明,等)

表C:prod_2cats(P_ID,CAT_ID) - 多对多

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

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

例如: - 分配给Y类 50个产品 - - 但只有10个产品(交叉)被分配给两个猫X和猫Ÿ

这个SQL适用于一个类别分配到X类 80产品:

SELECT * FROM产品WHERE p_show = 'Y' 和P_ID IN(SELECT的p_id FROM prods_2cats AS PC WHERE PC.cat_id = “$ CAT_ID。”

< - $ CAT_ID被消毒VAR从查询传递表格

我似乎无法找到的手段说“给我的猫的交叉和猫B”,并取回该子集(10条记录,从我的例子)

帮助!

回答

1

从集理论应用交集的定义。因此,如果X交叉Ÿ给人设置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) 
+0

谢谢 - 这是我一起去的,而且很有效。 (ANDS的链接) – MTCreations 2010-04-07 13:32:38

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) 
+0

谢谢 - 这是我一起工作,它的工作。 (ANDS的链接) – MTCreations 2010-04-07 13:35:11

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) 

希望这会有所帮助

+0

感谢您的回答 - 我首选其他(链接的ANDS),因为为简单起见,我还遗漏了其他查询部分 - 并且嵌套的子查询将更难以动态工作(如反对一系列AND链)。 – MTCreations 2010-04-07 13:34:23

+0

@MITCreations:de nada =)嵌套更短,我没有看到任何动态构建表达式的原因比用AND添加更多条件更难,恕我直言 – vittore 2010-04-07 14:04:00