2017-03-31 96 views
0

假設我有如下表:MySQL的GROUP_CONCAT重新排列值

ID|Col1 |Col2 
1 |Test1 |Test12 
2 |Test2 |Test22 
2 |Test3 |Test32 

當我使用類似的查詢:

SELECT GROUP_CONCAT(Col1) as First, GROUP_CONCAT(Col2) as Second WHERE ID=2 GROUP BY ID 

有時候返回GROUP_CONCAT的重新排列。例如:

ID|First  |Second 
2 |Test2,Test3|Test32,Test22 

雖然我希望它返回:

ID|First  |Second 
2 |Test2,Test3|Test22,Test32 

正如你可以看到,它在切換名爲「二」列連接值。我怎樣才能防止這種情況發生?

+0

使用'GROUP_CONCAT(Col2 ORDER BY Col2)'。因爲在SQL表中沒有固有的順序,所以'GROUP_CONCAT'返回的順序是* arbitray *。 –

+0

你在哪裏指定了排序? –

+0

@BoundaryImposition我假設GROUP_CONCAT會通過附加發現的行像row1,row2,row3等來返回它。但顯然它不是 –

回答

1

如果你想在一個特定的順序的值,然後使用order by

SELECT GROUP_CONCAT(Col1 ORDER BY Col1) as First, 
     GROUP_CONCAT(Col2 ORDER BY col2) as Second 
FROM t 
WHERE ID = 2 
GROUP BY ID; 

一般情況下,SQL涉及無序套。如果你想按特定順序進行操作,那麼你需要明確指定順序。

+0

這隻能在假定列內的值具有與A-B-C A-B-C相同的結構化結構時才起作用。當它是A-B-C B-A-C時它會失敗嗎? –

+0

@TVAvanHesteren。 。 。這將按照規範的順序返回值 - 按字母順序。如果您有另一列指定了排序,您可以在'ORDER BY'中使用它。 –

+0

我想實現的是CONCAT_GROUP Col2以與CONCAT_GROUP Col1相同的順序返回值,這是目前我無法實現的。我嘗試在兩個Col1上對它們進行加固,兩個都在它們自己的列表中,所以Col2由Col2,Col1由Col1。但它仍然不匹配返回的組的索引中找到的行 –

1

此表缺少用於在group_concat中排序的公共列(PK)。

ID |的GroupID | Col1中| col2的

1 | 1 |測試1 | TEST12

2 | 2 |的Test2 | Test22

3 | 2 | Test3的| Test32

SELECT GROUP_CONCAT(Col1 ORDER BY ID) as First, 
     GROUP_CONCAT(Col2 ORDER BY ID) as Second 
FROM t 
WHERE GroupID = 2 
GROUP BY GroupID; 

這將保留col1和col2的組連續的順序。

+0

是的,但我沒有選擇添加另一列的選項。雖然在GROUP_CONCAT中爲訂單+1,但沒有意識到這是可能的 –