mysql - 查找所有具有相同关键字的产品
问题描述
我有三张桌子:
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
如果这是一个问题,请明智地使用作品。
推荐阅读
- android - Facebook 提供商未配置。确保添加“facebook_application_id”字符串
- android-studio - Android Studio:非递归折叠所有方法
- excel - 是否可以分阶段运行 VBA 宏以减少运行时间?
- javascript - TypeError:未定义不是对象(评估“navigation.state.params.currentRoutine”)?
- apache - 修改工作 AddHandler 以仅匹配当前目录中的文件,而不是子目录
- python - Python正则表达式替换忽略转义字符
- python - BeautifulSoup 解析和组织数据
- http - 如何从 Firebase 中的文本文件中显示文本?
- javascript - 如何在 node.js 中访问 JSON 对象的动态键值?
- c - C中的结构调用内部的结构