2017-03-31 97 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,但没有意识到这是可能的 –