我带有标签的表格。它有列id,tagTypeId和tagName。每个项目可以有许多标签。 对于每个项目,我想选择tagTypeId 1,2和3的第一个标签。我尝试在我的查询中添加3个几乎相同的左连接,这非常好但是速度非常慢(例如5秒,表中的数据量不小)
就像
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 :(得分: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
每个项目都会有几行,可以在程序中轻松转换。
答案 1 :(得分: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
这会给你你想要的东西,但是在不同的栏目中。
答案 2 :(得分: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