2014-01-21 186 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