2017-03-06 83 views
0

我目前正在研究一款小型RPG遊戲,但遇到了一個小問題。mysql select查詢與同一個表的多個group_concat

單元表

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

裝備表1

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

裝備表2

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

說,如果現在我瓦特anted使單元的概述,列出所有可能的equipable類型的插槽,比方說像這樣

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  

但是,如果我以這種方式構建,我將如何實現相同的結果?

回答

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 
+0

但是你仍然在使用兩個表格,我問是否可以使用一個表格。 –

+0

當你有兩個數據時,你如何使用一張表?我的意思是equiptTable1和equiptTable2都有數據,這些數據是有效的,那麼我們如何從選擇中闡明它們呢? – BhandariS

+0

如我的示例中所示,NEW equip表中有一個新列'EquipSlot',用於判斷equiptype是否應進入equiplot1或equipslot2的結果 –

0

檢測周圍後,我終於來找到解決我自己的問題的解決方案。

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

希望有人會遇到我的同樣的問題,並覺得這有幫助。