【问题标题】:MySQL selecting tagsMySQL选择标签
【发布时间】:2014-02-10 23:39:32
【问题描述】:

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

我怎样才能更好地实现它,一次加入?

【问题讨论】:

  • “选择第一个标签”是什么意思?按什么排序?

标签: mysql sql select join group-by


【解决方案1】:

如果你做类似的事情

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

每个项目有几行,可以在程序中轻松转换。

【讨论】:

    【解决方案2】:
    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最小的标签
    【解决方案3】:

    这是另一种看法。它依赖于分组以“旋转”标签 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      相关资源
      最近更新 更多