在 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字段,字段内容不完整。