我使用以下查询来搜索标题中包含某些单词的博客。每个单词都在标签表中记录为唯一的,然后引用表tags_titles 中的实际博客。 t.label是实际标签词的存储位置。
出于某种原因,此查询不会产生任何结果,除非我输入一个数字,在这种情况下它会产生所有博客而不进行过滤。我怎样才能让它发挥作用?
SELECT tt.blog_id, b.title, COUNT(*) AS total_matches
FROM tags_titles AS tt
INNER JOIN tags AS t
ON tt.tag_id = t.tag_id
LEFT JOIN blogs AS b
ON tt.blog_id=b.blog_id
WHERE t.label IN ('boats','planes')
GROUP BY tt.blog_id
ORDER BY total_matches DESC
最佳答案
我认为您需要右连接
而不是左连接
并修复查询中的一些其他细节:
SELECT b.blog_id, b.title, COUNT(t.label) AS total_matches
FROM tags_titles tt INNER JOIN
tags t
ON tt.tag_id = t.tag_id RIGHT JOIN
blogs b
ON tt.blog_id=b.blog_id and
t.label IN ('boat','plane')
GROUP BY b.blog_id
ORDER BY total_matches DESC;
您正在请求博客级别的某些内容。然而,连接保留了所有标签,而不是博客。一旦切换到博客,total_matches
就会计算匹配标签的数量以获取计数(count(*)
永远不会返回 0
这种情况下,因为不会有行)。
如果您想要至少一场比赛,请添加havingtotal_matches > 0
。
关于Mysql - 按标签搜索博客,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17864929/