首页 > 解决方案 > mysql 按多列排序,如果

问题描述

SELECT s.name, s.mark, g.grade FROM students s, grades g
where g.grade = ( Select grade from grades where s.mark >= min_mark and s.mark <= max_mark)
order by IF(g.grade='F' or g.grade='E' or g.grade='D', (g.grade, s.mark), g.grade)

这是我正在尝试但没有让它工作的 mysql 语法。

选择按预期工作,但我想订购从 A 到 F 的成绩,并且在相同的成绩上,我想订购 AC 的标记 desc 和 DF 的 asc

希望很清楚我想要什么:

name            grade     mark
Ewan Black         A      100
Ryan Richards      B      90
Drake Porter       C      78
Jamie Miller       C      76
NULL               D      67
NULL               F      43
NULL               F      54

标签: mysql

解决方案


正如@Vatev 所指出的,您可以使用条件语句来更改要排序的第二个值。我建议使用CASE语句,因为它更符合 SQL 标准。另外,我建议您使用标准JOIN语法,而不是旧式(20 年以上)连接。此外,您不需要子查询。所以是这样的:

select
    students.name
    ,grades.grade
    ,students.mark
from students
    inner join grades on
        students.mark between grades.min_mark and grades.max_mark
order by
    grades.grade
    ,case
        when grades.grade in ('D', 'E', 'F')
            then students.mark
        else
            100 - students.mark
    end

推荐阅读