【问题标题】:SQL equivalent of IN operator that acts as AND instead of OR?相当于 IN 运算符的 SQL 等效于 AND 而不是 OR?
【发布时间】:2012-07-20 02:54:00
【问题描述】:

我将简单地展示我正在尝试做的事情,而不是描述。 3NF 中的 3 个表。 product_badges 是连接表。 (exists 子查询是必须的。)

SELECT * FROM shop_products WHERE EXISTS ( // this line cannot change
    SELECT * FROM product_badges as pb 
    WHERE pb.product_id=shop_products.id
    AND pb.badge_id IN (1,2,3,4)
);

现在这将返回badge_id 为1 OR 2 OR 3 OR 4 的所有产品。我想要只获得满足所有这些值的产品。我试图做 pb.badge_id=1 和 pb.badge_id=2 等,但这什么都没有返回——这对我来说很有意义。我还尝试使用 INTERSECT 进行多个查询,但这导致了错误。我猜多个查询是关键,但 UNION 与 IN 基本相同,我不确定在这种情况下如何使用 JOIN。

【问题讨论】:

  • 列匹配所有值实际上没有意义。一条记录可以有多个列,但是,该列只能有一个值。
  • 您正在寻找关系除法运算符(不存在),但您可以使用the methods here之一
  • @Ek0nomik - 该列是多对多连接表的一部分,将多个属性链接到多个产品。把它想象成寻找裤子,但我只想要有口袋和货物口袋和纽扣门襟的裤子,而不是归还所有的裤子。 badge_id 与这些属性中的每一个相关
  • @MartinSmith 感谢您的链接。看起来这正是另一篇文章所说的。更好地了解正在发生的事情的好机会

标签: sql inner-join 3nf


【解决方案1】:

请尝试以下方法(假设恰好需要 4 个不同的 bagde_id):

SELECT * FROM shop_products WHERE EXISTS ( // this line cannot change
    SELECT pb.product_id, count(distinct pb.bagde_id) FROM product_badges as pb 
    WHERE pb.product_id=shop_products.id
    AND pb.badge_id IN (1,2,3,4)
    GROUP BY pb.product_id
    HAVING count(distinct pb.bagde_id) = 4
);

【讨论】:

    猜你喜欢
    • 2011-12-26
    • 2014-05-11
    • 1970-01-01
    • 2016-02-20
    • 2011-01-21
    • 1970-01-01
    • 2018-04-30
    • 2011-06-27
    相关资源
    最近更新 更多