【问题标题】:MySQL select where in but not in with joinMySQL select where in 但 not in with join
【发布时间】:2011-02-16 12:12:03
【问题描述】:

我的数据库中有三个表:

产品

  • id(整数,主键)
  • 名称(varchar)

标签

  • id(整数,主键)
  • 名称(varchar)

产品标签

  • product_id (int)
  • tag_id (int)

我正在执行 SQL 查询以选择具有给定 ID 的已分配标签的产品:

SELECT * FROM Products
JOIN ProductTags ON Products.id = ProductTags.product_id
WHERE ProductTags.tag_id IN (1,2,3)
GROUP BY Products.id

我可以选择没有指定 ID 的产品:

SELECT * FROM Products
JOIN ProductTags ON Products.id = ProductTags.product_id
WHERE ProductTags.tag_id NOT IN (4,5,6)
GROUP BY Products.id

我如何结合这些查询来选择具有给定标签但没有其他标签的产品?我试图以这种方式实现这一目标:

SELECT * FROM Products
JOIN ProductTags ON Products.id = ProductTags.product_id
WHERE ProductTags.tag_id IN (1,2,3)
AND ProductTags.tag_id NOT IN (4,5,6)
GROUP BY Products.id

但它显然不起作用,给我带有标签 (1,2,3) 的产品,无论它们是否分配了标签 (4,5,6)。是否可以使用一个查询来解决此问题?

【问题讨论】:

  • 第二个查询返回除仅标记为 4、5 或 6 的产品之外的所有产品。例如,如果产品标记为 2 和 5,它将包含在查询中。因此,结合第一个和第二个查询是没有意义的,因为第一个查询包含的任何产品都不会被第二个查询排除。

标签: mysql select join where-in


【解决方案1】:

使用子查询过滤掉包含不需要标签的产品列表:

SELECT * FROM Products
  JOIN ProductTags ON Products.id = ProductTags.product_id
  WHERE ProductTags.tag_id IN (1,2,3)
    AND Products.id NOT IN (SELECT product_id FROM ProductTags WHERE tag_id IN (4,5,6))
  GROUP BY Products.id

【讨论】:

  • 非常感谢,它解决了问题。我认为如果不使用子查询就无法实现这一点,对吗?
  • 不幸的是,这不是我所需要的。我不知道使用 WHERE IN 是否是个好主意。例如,我想选择标签为 1 AND 2 AND 3,但没有标签 4 OR 5 OR 6 的产品。上述解决方案为我提供了标签为 1 OR 2 OR 3 的产品,没有标签 4 OR 5 OR 6。
  • 当然可以,尽管这不是您的问题的措辞。要包含标签 1 和 2,请在 ProductTags 表上连接两次:在 p.id = pt1.product_id 和 pt1.tag_id = 1 上连接 ProductTags pt1 在 p.id = pt2.product_id 和 pt2.tag_id = 2 上连接 ProductTags pt2跨度>
猜你喜欢
  • 1970-01-01
  • 2017-03-08
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
  • 2012-05-01
相关资源
最近更新 更多