2011-01-20 68 views
0

我查詢每行有多個標籤的表:MySQL查詢 - 搜索在連接表不篩選記錄

SELECT 
    user.*, 
    GROUP_CONCAT(tag.tag SEPARATOR ", ") as `tags` 
FROM 
    user 
LEFT JOIN 
    user_tag 
ON 
    user_tag.user_id = user.id 
LEFT JOIN 
    tag 
ON 
    tag.id = user_tag.tag_id 
GROUP BY 
    user.id 

現在我希望能夠通過標籤進行搜索的用戶。 所以加入其中後,它看起來像這樣:

SELECT 
    user.*, 
    GROUP_CONCAT(tag.tag SEPARATOR ", ") as `tags` 
FROM 
    user 
LEFT JOIN 
    user_tag 
ON 
    user_tag.user_id = user.id 
LEFT JOIN 
    tag 
ON 
    tag.id = user_tag.tag_id 
WHERE 
    tag.tag LIKE "%engineer%" OR 
    tag.tag LIKE "%programmer%" 
GROUP BY 
    user.id 

然而,這手段(明顯),如果結果發現,標籤表未返回所有的用戶標籤了。所以選中的列tags可能看起來像「php程序員」,即使用戶有更多的標籤。

有什麼方法可以在不使用子查詢的情況下實際限制返回的結果來搜索連接表嗎?

+0

看來你想爲所有用戶添加一個標籤,例如「%engineer%」或「%programmer%」。但是,當然EXISTS子句被認爲是子查詢,所以也許這不是你想要的答案。如果是這樣,我可以告訴你如何構建查詢。 – hardmath 2011-01-20 11:51:37

回答

0

您可以添加其他JOIN,像這樣的標籤:

SELECT 
    user.*, 
    GROUP_CONCAT(user_tags_to_return.tag SEPARATOR ", ") as `tags` 
FROM 
    user 
LEFT JOIN 
    user_tag user_tags_to_filter 
ON 
    user_tags_to_filter.user_id = user.id 
LEFT JOIN 
    tag tags_to_filter 
ON 
    tags_to_filter.id = user_tags_to_filter.tag_id 
WHERE 
    tags_to_filter.tag LIKE "%engineer%" OR 
    tags_to_filter.tag LIKE "%programmer%" 
LEFT JOIN user_tag user_tags_to_return 
ON user_tags_to_return.user_id = user.id 
LEFT JOIN tag tags_to_return 
ON tags_to_return.id = user_tags_to_return.tag_id 
GROUP BY 
    user.id 
+0

愚蠢的我。我已經嘗試過再次加入標籤表,但我也應該再次加入user_tag表。 – sander 2011-01-20 11:37:36

1

這裏我的猜測是,如果你想避免你可以使用一個HAVING子句與「標籤」的子查詢,像這樣:

SELECT 
    user.*, 
    GROUP_CONCAT(tag.tag SEPARATOR ", ") as `tags` 
FROM 
    user 
LEFT JOIN 
    user_tag 
ON 
    user_tag.user_id = user.id 
LEFT JOIN 
    tag 
ON 
    tag.id = user_tag.tag_id 
GROUP BY 
    user.id 
HAVING 
    tags LIKE "%engineer%" OR tags LIKE "%programmer%" 
+0

這是一個不錯的主意。它適用於這種情況,因爲條件使用`%LIKE%`,因此,如果我們比較一個標記或所有這些標記的連接,則無關緊要。 – 2011-01-20 11:15:52