mysql - 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
解决方案
正如@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
推荐阅读
- python - 如何在 SMALLINT 上使用 teradatasql 在数据库中插入空值,计算期间发生数值溢出
- swift - 来自 myClass 的 NSClassFromString
- javascript - 在其中渲染 svg 内容
- reactjs - 当输入在子组件中时如何在反应中处理表单
- ruby - 安装 gem 的问题
- android - 如何在 android 中读取 .vid 文件
- rstudio - 我无法使用命令 install.packages 在 rstudio 中安装 ggplot,我该如何解决这个问题?
- r - 标签位于 R 条形图中的条形下方
- sql-server - SQL Server LocalDB 在哪里存储主数据库和数据库列表?
- python-3.x - 如何使以下for循环在Python中使用多个核心?