我知道,MySQL的5.x的不支持交叉,但是,这似乎是我所需要的。

表A:产品(P_ID)

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

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

prod_2cats保持许多(1或多个)已被分配给产品(A)的类别。

否则查询/过滤器查找,(用户交互)和需要能够跨越多个类别选择产品满足所有的条件。

例: - 分配给X类80多个产品 - 分配给Y类50个产品 - 但只有10个产品(相交)被分配给BOTH猫X AND猫ý

此SQL适用于一个类别:

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条记录,从我的例子)

帮助!

有帮助吗?

解决方案

这组理论应用交叉点的定义。因此,如果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)

其他提示

嗯,我不知道它是做的最好的方式,但它可以在你的已经存在的查询很方便地添加:

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

希望这有助于

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top