mysql选择查询与同一个表的多个group_concat

时间:2017-03-06 03:51:46

标签: mysql group-concat

我目前正在制作一款小型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     

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

2 个答案:

答案 0 :(得分:0)

您可以使用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

答案 1 :(得分:0)

经过测试后,我终于找到了解决我自己问题的解决方案。

所以我的想法是使用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

希望有人会遇到同样的问题并发现这有用。