在 mySql 中也有 group_concat 的计算字段上排序

Posted

技术标签:

【中文标题】在 mySql 中也有 group_concat 的计算字段上排序【英文标题】:order by on calculated field that also has group_concat in mySql 【发布时间】:2012-11-26 20:09:34 【问题描述】:

这是我想要完成的简化版本。假设我有一个人表和一个测试表。每个测试都有 2 个与之关联的分数,每个人可以有 0,1 或多个测试

人 - 个人身份(PK) - 人名

测试 - testId (PK) - PersonId (FK) - test1Score - test2Score

我正在尝试获得一个结果集,该结果集为我提供了人员排序列表和平均 testScores。这就是我正在做的事情

SELECT GROUP_CONCAT( CASE  
    WHEN( tests.test1Score > 0 )   
    THEN( ( tests.test1Score + tests.test2Score)/2 )  
    ELSE( 99999999 ) END) as averageScore, person.PersonName  
FROM person  
JOIN tests  
    ON person.personId = tests.personId   
GROUP BY person.personId   
ORDER BY averageScore

发生的事情是 group_concat 返回一个字符串并按照我的顺序进行排序,结果是这样的

人名1 | 5,6 人名2 | 51,60 人名3 | 6、60

我知道我必须先按单个计算字段排序,然后按 group_concatenated 值排序,但不知道该怎么做..

任何帮助将不胜感激

【问题讨论】:

你必须使用 group_concat 来完成这个吗? 您的预期结果是什么?你想按分数排序吗? ***.com/a/5085334/1166285 @kermit 是的.. 我正在使用 group_concat 将结果作为逗号分隔列表.. @iight yup.. 按分数排序。感谢这个例子,但它表明您可以使用现有字段进行排序。在我的情况下,我需要按计算字段排序。 【参考方案1】:

您可以使用聚合子查询来执行此操作,并在您喜欢的任何字段上进行分组,而不是在连接的字符串上。使用您的字段的示例:

SELECT person.personID, person.personName, p.AvgOftest1score, p.AvgOftest2score
FROM person
INNER JOIN
(
SELECT personID, Avg(test1score) AS AvgOftest1score, Avg(test2score) AS AvgOftest2score
FROM tests
GROUP BY personID
) p
ON person.personID = p.personID
ORDER BY p.AvgOftest1score, p.AvgOftest2score;

【讨论】:

同意.. 但我需要结果采用上述格式.. 以您的示例为例,AvgOftest1score 和 AvgOftest2score 是 2 个不同的字段.. 我希望它们用逗号分隔(因此使用GROUP_CONCAT)。

以上是关于在 mySql 中也有 group_concat 的计算字段上排序的主要内容,如果未能解决你的问题,请参考以下文章

在navicat for mysql 写一个视图 A表中有X字段,字段内容完整;B表中也有X字段,字段内容不完整。

解决mysql中group_concat长度限制的方案

使用 MySQL 在不同字段上的多个 GROUP_CONCAT

MySQL中使用group_concat遇到的坑

在带有函数的 MySQL GROUP_CONCAT 中排序

MYSQL中group_concat有长度限制!默认1024