【问题标题】:mySQL experts - need help with 'intersect'mySQL 专家 - 需要“相交”方面的帮助
【发布时间】:2010-04-05 20:46:28
【问题描述】:

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

表 A:产品 (p_id)

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

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

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

进行查询/过滤查找,(用户交互)并且需要能够跨多个类别选择满足所有条件的产品。

例如: - 80 种产品分配到 X 类 - 50 个产品分配到类别 Y - 但只有 10 个产品(相交)分配给 cat X 和 cat 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 ."

我似乎找不到说“给我猫 A 和猫 B 的交集”并取回子集的方法(来自我的示例的 10 条记录)

帮助!

【问题讨论】:

    标签: mysql select union intersect


    【解决方案1】:

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

    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)
    

    【讨论】:

    • 谢谢 - 这就是我所做的,它奏效了。 (ANDS的链接)
    【解决方案2】:

    应用集合论中的交集定义。因此,如果 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)
    

    【讨论】:

    • 谢谢 - 这就是我所做的,它奏效了。 (ANDS的链接)
    【解决方案3】:
    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 )
    

    希望对你有帮助

    【讨论】:

    • 感谢您的回答 - 我更喜欢另一个(链式 ANDS),因为为简单起见,我省略了查询的其他部分 - 并且一组嵌套的子查询将更难以动态处理(而不是 AND 链的集合)。
    • @MITCreations: de nada=) 嵌套更短,我看不出为什么动态构建表达式比使用 AND 添加一个条件更难,恕我直言
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多