2008-10-03 48 views
2

標籤識別,標籤名MySQL的限制與許多來給出模式實現標籤</p> <p>項目 項目Id,ItemContent</p> <p>TAG許多關係

ITEM_TAG 項目Id,標籤識別

什麼選擇標籤時限制ITEMS返回數量的最佳方法是什麼?

SELECT i.ItemContent, t.TagName FROM item i 
INNER JOIN ItemTag it ON i.id = it.ItemId 
INNER JOIN tag t ON t.id = it.TagId 

當然是讓他們都回來了最簡單的方法,但使用的限制條款壞了,因爲你得到的所有項目對每個標籤,這對在限行數計數的重複。

回答

4

我的第二個解決方案使用MySQL函數GROUP_CONCAT()將匹配項的所有標記組合到結果集中以逗號分隔的字符串中。

SELECT i.ItemContent, GROUP_CONCAT(t.TagName ORDER BY t.TagName) AS TagList 
FROM item AS i 
    INNER JOIN ItemTag AS it ON i.id = it.ItemId 
    INNER JOIN tag AS t ON t.id = it.TagId 
GROUP BY i.ItemId; 

GROUP_CONCAT()函數是一個MySQL特性,它不是標準SQL的一部分。

+0

GROUP_CONCAT正是會工作的解決方案。謝謝! – apg 2008-10-03 16:28:48

0

也許像

select i.ItemContent, t.TagName from (SELECT ItemId, ItemContent FROM item limit 10) i 
INNER JOIN ItemTag it ON i.ItemId = it.ItemId --You will miss tagless items here! 
INNER JOIN tag t ON t.id = it.TagId 
0

我的第一個建議是使用子查詢,生成項目ID的列表,並返回項目符合這些項目的ID。但是這不包括結果集中的TagName。我會用另一個解決方案提交一個單獨的答案。

SELECT i.ItemContent 
FROM item AS i 
WHERE i.id IN (
    SELECT it.ItemId 
    FROM ItemTag AS it 
    INNER JOIN tag AS t ON (t.id = it.TagId) 
    WHERE t.TagName IN ('mysql', 'database', 'tags', 'tagging') 
); 

這是一個不相關的子查詢,所以一個好的SQL引擎應該將其排除並運行一次。

0

你也可以使用distinct /組方:

SELECT DISTINCT TagID, TagName FROM ((TAG T INNER JOIN ITEM_TAG I_T ON T.TagID = I_T.TagID) INNER JOIN ITEM I ON I_T.ItemID = I.ItemID) GROUP BY TagID, TagName