2013-07-25 59 views
0

我正在使用以下查詢來搜索在其標題中包含某些詞的博客。每個單詞在表格標記中被記錄爲唯一,然後在表格tags_titles中引用實際的博客。 t.label是實際標籤字的存儲位置。Mysql - 按標籤搜索博客

出於某種原因,此查詢不會產生任何結果,除非我輸入一個數字,在這種情況下,它會生成所有博客而不進行過濾。我怎樣才能使這個工作?

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

也許你需要使用'WHERE t.label LIKE'%boat%'或t.label LIKE'%plane%''? – fthiella

+0

由於性能損失,我不想使用LIKE。這些可以完全匹配,這將是沒有問題的! :) –

+0

你是什麼意思「除非我輸入一個數字」..你在哪裏插入一個數字? – mcriecken

回答

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,因爲不會有行)。

如果您想要至少一個匹配項,請包含having total_matches > 0

+0

這產生所有博客和總匹配爲0,不做任何過濾,我想:) –

+0

@AmyNeville。 。 。查看最終評論。或者,將'right join'改爲'inner join'。 –

+0

如果我使用右連接或內連接,則結果相同 –