首页 > 解决方案 > 查找所有具有相同关键字的产品

问题描述

我有三张桌子:

products(product_id, product_description)
keywords(keyword_id, keyword_name)
product_keyword(FOREIGN KEY(product_id) REFERENCES products(product_id), FOREIGN KEY (keyword_id)  REFERENCES keywords(keyword_id))

如果我想返回与给定产品具有相同关键字的所有产品,我该怎么做?

我已经尝试了一些类似的东西:

SELECT * from products
WHERE product_keyword having product_keyword.product_id = 1 /* don't know how to make this a general statement, but let's assume that I'm looking for all products with the same keywords as product number 1

想不通。

标签: mysqlsql

解决方案


一种方法是将关键字连接在一起并使用该字符串进行连接:

select p.product_id, p.keyword_ids
from (select product_id, group_concat(keyword_id order by keyword_id) as keyword_ids
      from product_keywords
      group by product_id
     ) p join
     (select group_concat(keyword_id order by keyword_id) as keyword_ids
      from product_keywords
      where product_id = 1
     ) p1
     on p.keyword_ids = p1.keyword_ids;

另一种方法比较麻烦,但使用更传统的 SQL。对关键字进行自加入并进行大量计数:

select p.product_id
from key_words p left join
     key_words p1
     on p1.key_word = p.key_word nd
        p1.product_id = 1
group by p.product_id
having count(*) = count(p1.keyword) and
       count(*) = (select count(*) from key_words pp1 where pp1.product_id = 1);

left join保留每个产品的所有关键字。然后having做了两件事:

  • count(*)=count(p1.keyword)仅返回所有关键字都匹配的行。
  • 确保关键字的count(*) = <subquery>数量是第一个产品的数量。

这两个公式都假设product_keywords 中没有重复,这似乎是一个合理的假设。distinct如果这是一个问题,请明智地使用作品。


推荐阅读