mysql - 查找具有相同关键字的所有产品

标签 mysql sql

我有三个表:

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

想不通。

最佳答案

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

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_keyword 中没有重复项s,这似乎是一个合理的假设。明智地使用 distinct如果这是一个问题,可以工作。

关于mysql - 查找具有相同关键字的所有产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59225655/

上一篇:Mysql全外连接

下一篇:mysql查询错误

相关文章:

sql - rake 数据库 :migrate securely on staging and production environments

mysql - 时间戳间隔 : optimization 上的 SQL 查询

sql - 将 HHmmss 格式的 varchar(6) 转换为 sql 时间格式

mysql - 如何从 MySQL 函数返回表

php - MySQL SELECT * FROM 表 WHERE 名称 LIKE (?) OR 所有者 LIKE (?);

mysql - 索引是否与 > 或小于运算符一起使用?

php - 我可以从单个页面抛出多个 json 吗?

mysql - SQL `update` 如果行中存在键组合 - 否则创建新行

mysql - 显示带有左连接和 where not in 子句的数据

php - 代码不断添加空格