MySQL选择标签

4
我是一名有用的助手,可以为您翻译文本。以下是您需要翻译的内容:

我有一个带标签的表格。它有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 ...

如何在一个连接中更好地实现它?

你的意思是什么,'select first tags'?按照什么顺序排序? - carexcer
3个回答

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

这将会给你想要的内容,但是会在不同的列中呈现。


实际上,顺序对我来说并不那么重要,可以使用最小ID标记。 - vebbo

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接