2017-02-27 39 views
0

我有一个MySQL查询,看起来类似于以下如何在Group_Concat列上排序时使用TRIM?

SELECT 
    ta.*, 
    GROUP_CONCAT(tb.value) AS `grouped_value` 
FROM 
    test.test_a ta 
INNER JOIN test.test_b tb ON tb.id = ta.t_id 
GROUP BY ta.t_id 
ORDER BY `grouped_value` ASC 

我用GROUP_CONCAT函数创建一个逗号分隔值,别名为grouped_value。上面的查询按照原样运行,但grouped_value可能包含前导空格和排序最终结果。我试图使用TRIM函数,但在这种情况下似乎不起作用。

SELECT 
     ta.*, 
     GROUP_CONCAT(tb.value) AS `grouped_value` 
FROM 
    test.test_a ta 
INNER JOIN test.test_b tb ON tb.id = ta.t_id 
GROUP BY ta.t_id 
ORDER BY TRIM(`grouped_value`) ASC 

错误消息

错误代码:1247 - 参考 'grouped_value' 不支持(参照组功能)

是否有可能使用TRIM,同时在分选组连接列?如果不是,这个错误的解决方法是什么?

+0

为什么在不使用GROUP BY的情况下使用聚合函数GROUP_CONCAT()?你真的想要什么输出?您当前的查询似乎没有意义。 –

+0

@TimBiegeleisen我加了'GROUP BY',看起来我错过了它,而写了问题 – Wondercricket

+0

修剪之前分组? 'GROUP_CONCAT(trim(tb.value))as grouped_value' – dognose

回答

2

看起来要修剪每一个单独的值的列表。在这种情况下,将其放置在GROUP_CONCAT调用内部:

SELECT 
    ta.*, 
    GROUP_CONCAT(TRIM(tb.value)) AS grouped_value 
FROM 
    test.test_a ta 
INNER JOIN test.test_b tb ON tb.id = ta.t_id 
GROUP BY ta.t_id 
ORDER BY grouped_value ASC 

正如评论所讨论的,如果你需要保持空白中显示的值,那么你将仅需要做的order by子句中微调:

ORDER BY GROUP_CONCAT(TRIM(tb.value)) ASC 
+0

如果您需要用于显示目的的空格,请使用第二列,专用于排序(修剪)和一个(未修剪)以显示。 – dognose

+1

@dognose我确实需要保留空格,这就是为什么我使用'trim'而不是'group_concat'的原因。将您的建议添加到答案将作为解决方法 – Wondercricket

0

你被uing一个aggegatioin功能而不群(你应该esplicitally在选择设置列名和组) 例如:假设你有col1和col2上从TA你要跟应该

SELECT 
    ta.col1, ta.col2, 
    GROUP_CONCAT(tb.value) AS `grouped_value` 
FROM 
    test.test_a ta 
INNER JOIN test.test_b tb ON tb.id = ta.t_id 
GROUP BY ta.col1, ta.col2, 
ORDER BY `grouped_value` ASC 

心钠素的修剪简单的应用导致

SELECT 
    ta.col1, ta.col2, 
    trim(GROUP_CONCAT(tb.value)) AS `grouped_value` 
FROM 
    test.test_a ta 
INNER JOIN test.test_b tb ON tb.id = ta.t_id 
GROUP BY ta.col1, ta.col2, 
ORDER BY `grouped_value` ASC