2014-01-21 226 views
4

我已經將表格與標籤。它有列id,tagTypeId和tagName。每個項目可以有很多標籤。 對於每個項目,我想選擇tagTypeId 1,2和3的第一個標籤。我嘗試在我的查詢中添加3個幾乎完全相同的左連接,它工作得很好,但是速度很慢(比如表中數據量不是很少的5秒鐘)MySQL選擇標籤

它是像

select i.*, tag1.name, tag2.name, tag3.name from items i 
left join (select t.id, t.tagName as name from tags t where t.tagTypeId=1) tag1 on ... 
left join (select t.id, t.tagName as name from tags t where t.tagTypeId=2) tag2 on ... 
left join (select t.id, t.tagName as name from tags t where t.tagTypeId=3) tag3 on ... 

我怎樣才能更好地實現它,在一個連接?

+0

你是什麼意思與 '選擇第一個標籤'?按什麼排序? – carexcer

回答

0

,如果你這樣做

select i.*, tag.name, tagTypeId 
    from items i left join (select t.id, t.tagName as name 
          from tags t where t.tagTypeId in (1, 2, 3)) on ... 
order by i.itemid, tagTypeId 

你會得到每件幾行,它可以很容易地在程序被調換。

0
SELECT * FROM 
(SELECT id id1, tagTypeId tag1 FROM items WHERE tagTypeId = 1 LIMIT 1) X1, 
(SELECT id id2, tagTypeId tag2 FROM items WHERE tagTypeId = 2 LIMIT 1) X2, 
(SELECT id id3, tagTypeId tag3 FROM items WHERE tagTypeId = 3 LIMIT 1) X3 

這會給你你想要的,但在不同的列。

+0

其實順序對我來說並不重要,它可以是最小編號的標記 – vebbo

+0

好的,我在編輯。 – carexcer

0

這是另一個需要考慮的問題。它依賴於將標籤1..3'轉向'和Max()以排除空值。

select i.ItemId, i.ItemName, 
    MAX(CASE WHEN(t.tagTypeID = 1) THEN t.TagName ELSE NULL END) AS Tag1Name, 
    MAX(CASE WHEN(t.tagTypeID = 2) THEN t.TagName ELSE NULL END) AS Tag2Name, 
    MAX(CASE WHEN(t.tagTypeID = 3) THEN t.TagName ELSE NULL END) AS Tag3Name 
from items i 
    INNER JOIN tags t 
    on t.ItemID = i.ItemID 
where t.tagTypeId IN (1,2,3) 
GROUP BY i.ItemID, i.ItemName 

SqlFiddle here