【问题标题】:mysql n:m relationship: Find rows with several specific relationsmysql n:m 关系:查找具有几个特定关系的行
【发布时间】:2012-07-10 17:28:55
【问题描述】:

我有两个 SQL 表,“产品”和“标签”。它们具有 n:m 关系,使用第三个表“product_tags”。

我想使用查询来查找具有多个特定标签的每个产品。例如,查找与标签 1、23 和 54 相关的所有产品。

有没有办法只用一个查询来做到这一点?

【问题讨论】:

    标签: mysql many-to-many


    【解决方案1】:

    您可以使用此解决方案。这将获取包含 ALL 关键字 1、23 和 54 的所有产品:

    SELECT a.*
    FROM products a
    INNER JOIN product_tags b ON a.product_id = b.product_id
    WHERE b.tag_id IN (1,23,54)
    GROUP BY a.product_id
    HAVING COUNT(1) = 3
    

    其中3 是您的WHERE IN 列表中的项目数,因此您可以根据要检查的标签数量进行相应调整。

    【讨论】:

    • 请告诉需要COUNT(1) = 3
    • 如果我用以下内容替换 HAVING 子句,它会完美运行:HAVING COUNT(b.tag_id) = 3 并添加 GROUP BY a.id
    • COUNT 背后的原因是,WHERE IN(...) 不关心括号内有多少元素匹配。如果没有 COUNT,结果将是“每个产品都有任何标签”而不是“每个产品都有标签”。
    • 只有一个问题:这将如何在百万行表 (product_tags) 上执行,并且读取非常频繁?偶尔添加(24 小时内 100 秒 - 没有爆发),修改/删除(24 小时内 10 秒)。标称硬件(4GB 内存,核心 i3)
    • 你如何在等效的 DBIx 语法中得到这个?
    【解决方案2】:

    试试这个

    选择 * 从

     PRODUCTS p 
     JOIN PRODUCT_TAGS pt ON p.ID = pt.PRODUCT_ID
     JOIN TAGS t ON pt.TAG_ID = t.ID AND
          t.ID IN (1, 23, 54)
    

    我假设列名。我认为列名是直截了当的,您可以轻松地使用列名。如果您需要更多说明,请告诉我。

    【讨论】:

      猜你喜欢
      • 2012-09-10
      • 2020-12-07
      • 2017-10-14
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 2021-11-15
      • 2017-08-28
      • 1970-01-01
      相关资源
      最近更新 更多