我正在使用以下查询来搜索其标题中包含某些字词的博客。每个单词在表标记中记录为唯一,然后引用表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
答案 0 :(得分:1)
我认为您需要right join
而不是left join
,并在查询中修复其他一些细节:
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
,因为没有行。< / p>
如果您想要至少一个匹配项,请添加having total_matches > 0
。