如何使用 MySQL 连接语句选择与链接表中的多个值匹配的记录?

Posted

技术标签:

【中文标题】如何使用 MySQL 连接语句选择与链接表中的多个值匹配的记录?【英文标题】:How can I select records that match multiple values in a linking table using a MySQL join statement? 【发布时间】:2020-04-23 14:18:42 【问题描述】:

我正在尝试修复用于产品过滤的查询,该查询对单个类别工作正常,但在选择多个类别时非常错误。该查询当前正在选择其 id 与一个 cat_id 或另一个匹配的所有产品,这是一个开始,但我无法弄清楚如何只获取其 id 匹配 BOTH 在 categories_linked 中选择的 cat_id 的产品。

以下是选择两个过滤器时当前正在运行的查询示例:

SELECT A.* FROM products A LEFT JOIN categories_linked B ON A.id = B.prod_id WHERE (B.cat_id = 1 || B.cat_id = 2) GROUP BY A.id;

例如,如果我通过 cat_id 1 和 2 过滤,我希望返回 id 为 1 的产品,但目前它返回 id 为 1、2 和 3 的产品。WHERE 子句是动态生成的,所以如果可以维护,甚至更好。

categories_linked

cat_id|prod_id|
------+-------+
     1|      1|
     1|      2|
     2|      1|
     2|      3|

产品

id |title |
---+------+
  1| item1|   
  2| item2|  
  3| item3|    

【问题讨论】:

这不是您要问的,但是--了解 LEFT JOIN ON 返回的内容: INNER JOIN ON rows UNION ALL 由 NULL 扩展的不匹配的左表行。作为 OUTER JOIN ON 的一部分,始终知道您想要什么 INNER JOIN ON。在 LEFT JOIN ON 之后,需要右 [sic] 表列不为 NULL 的 WHERE 或 INNER JOIN 删除任何引入了 NULL 的行,即只留下 INNER JOIN ON 行,即“将 OUTER JOIN 转换为 INNER JOIN”。你有那个。 PS ||现在已弃用,每种模式可能意味着 CONCAT。 请合理格式化您的代码。请在代码问题中提供minimal reproducible example。但这是一个常见问题解答。在考虑发布之前,请阅读手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:***.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。 PS你可以通过文字列表或表格做你想做的事。哪个? SQL query that gives distinct results that match multiple columns的可能重复 @philipxy 我改了 ||到或没有变化。您指向可能重复的链接似乎不适用。我不确定您所说的“您可以通过文字列表或表格做您想做的事情”是什么意思。 请提供minimal reproducible example,包括示例数据。重新“列表或表格”查看答案——有些使用in (list),有些使用in (subquery)。您需要加入,然后使用链接中的答案。理解链接的答案。 【参考方案1】:

感谢 Reddit 上的 /u/r3pr0b8 提供的帮助,不出所料,SO 不会。

SELECT products.* 
  FROM ( SELECT prod_id
          FROM categories_linked  
          WHERE cat_id IN ( 1 , 2 )
         GROUP
             BY prod_id
         HAVING COUNT(DISTINCT cat_id) = 2
       ) AS these       
INNER
  JOIN products
    ON products.id = these.prod_id

【讨论】:

以上是关于如何使用 MySQL 连接语句选择与链接表中的多个值匹配的记录?的主要内容,如果未能解决你的问题,请参考以下文章

SQL多表链接查询、嵌入SELECT语句的子查询技术

如何正确使用连接/子查询从多个表中选择数据? (PHP-MySQL)

如何对mysql表中的多个列进行连接

mysql怎样查询一个表中所有数据

如何从 SQL 表中选择特定行并连接 SQL 服务器中的多个表?

MySQL学习——SQL查询语句(连接查询&子查询)