【问题标题】:mysql select query with multiple group_concat of the same tablemysql select查询与同一张表的多个group_concat
【发布时间】:2017-03-06 03:51:45
【问题描述】:

我目前正在开发一款小型 RPG 游戏,但遇到了一个小问题。

单位表

UnitID | Name
------ | ------
1      | Bob

装备表1

UnitID | EquipTypeID
------ | -----------
1      | 5          
1      | 8          

装备表2

UnitID | EquipTypeID
------ | -----------
1      | 10         
1      | 12         

如果我现在想对单位进行概述,请列出插槽中所有可能的可装备类型,例如这样

UnitID | Name | EquipSlot1 | EquipSlot2
------ | ---- | ---------- | ----------
1      | Bob  | 5, 8       | 10, 12

我知道我可以将 group_concat 之类的东西用于...

SELECT ut.UnitID, ut.Name,
       group_concat(DISTINCT et1.equipTypeID) as EquipSlot1,
       group_concat(DISTINCT et2.equipTypeID) as EquipSlot2
FROM unitTable as ut
LEFT JOIN equipTable1 as et1
ON ut.UnitID = et1.UnitID
LEFT JOIN equipTable2 as et2
ON ut.UnitID = et2.UnitID

但是,我实际上在想的是,如果我可以简单地让它像...

装备表(将两个表组合在一起,并用附加列表示插槽)

UnitID | EquipTypeID | EquipSlot
------ | ----------- | ---------
1      | 5           | 1  
1      | 8           | 1  
1      | 10          | 2  
1      | 12          | 2     

但是,如果我以这种方式构建,我将如何获得相同的结果呢?

【问题讨论】:

    标签: mysql group-concat


    【解决方案1】:

    您可以使用 cas,因为您只想根据表格更改数字

    SELECT ut.UnitID, ut.Name, et1.equipTypeID,et2.equipTypeID
    Case 
       when et1.equipTypeID then 1 
       when et2.equipTypeID then 2 
    end AS EquipSlot 
    FROM unitTable as ut
    
    LEFT JOIN equiptTable1 as et1
    ON ut.UnitID = et1.UnitID
    LEFT JOIN equiptTable2 as et2
    ON ut.UnitID = et2.UnitID
    

    再次组合您的表格用例

    SELECT ut.UnitID, ut.Name, ut.equipTypeID, ut.EquipSlot 
    Case  when ut.ut.EquipSlot = 1  then group_concat(ut.equipTypeID) end as EquipSlot1 
    Case  when ut.ut.EquipSlot = 2  then group_concat(ut.equipTypeID) end as EquipSlot2   
    FROM unitTable as ut
    

    【讨论】:

    • 但是你还在用两张表,我问是否可以用一张代替。
    • 一张表里都有数据怎么用?我的意思是equiptTable1 和equiptTable2 都有有效的数据,那么我们如何从选择中消除它们?
    • 如我的示例所示,NEW 装备表有一个新列“EquipSlot”,用于判断装备类型是否应进入结果的装备槽 1 或装备槽 2
    • 因为我只使用两个表作为示例,但我的实际项目可能会有更多,所以我在想是否有更灵活的方式来做,而不仅仅是复制和粘贴表在相同结构的表之后。
    • @willy_sunny 我确信您可以弄清楚如何调整上述信息以适应您的情况
    【解决方案2】:

    经过测试,我终于找到了一个可以回答我自己问题的解决方案。

    所以想法是使用 SELECT on SELECT 方法根据 FROM 部分中作为新表所需的过滤器生成两个(或更多)表,然后只需 group_concat 结果即可获得我想要的答案。

    SELECT ut.UnitID, ut.Name, group_concat(DISTINCT et1.equipSlot1), group_concat(DISTINCT et2.equipSlot2)
    FROM unitTable as ut, 
    (SELECT et.unitID, et.EquipTypeID as equipSlot1 FROM equipTable as et, unitTable as ut WHERE et.unitID = ut.unitID AND et.EquipSlot = 1) as et1,
    (SELECT et.unitID, et.EquipTypeID as equipSlot2 FROM equipTable as et, unitTable as ut WHERE et.unitID = ut.unitID AND et.EquipSlot = 2) as et2
    WHERE ut.unitID=et1.unitID AND ut.unitID=et2.unitID
    GROUP BY ut.unitID
    

    希望有人会遇到我同样的问题并觉得这很有帮助。

    【讨论】:

      猜你喜欢
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多