0

我正在使用以下查询来搜索标题中包含某些单词的博客。每个单词在表标签中被记录为唯一的,然后在表 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
4

1 回答 1

1

我认为您想要 aright join而不是 aleft 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,因为不会有行)。

如果您想要至少一个匹配项,请包含having total_matches > 0.

于 2013-07-25T17:39:55.117 回答