sql - 如何在 SQL 中按两级按列排序?
问题描述
我需要编写一条 SQL 语句来选择和排序按值和名称的优先级排序的数据。请参阅以下标准。
数据库架构:
name : string
isSpecial : boolean
isA1 : boolean
isA2 : boolean
isA3 : boolean
排序优先级(isA1、isA2、isA3的优先级相等,我想从isAx的true数排序)
- 是特别的
- 3A(所有 isA 都为真)
- 2A(两个 isA 为真)
- 1A(只有一个 isA 为真)
- 二级排序:姓名
例子
id, name, isSpecial, isA1, isA2, isA3
1, aaa, false, true, true, true
2, bbb, true, true, true, true
3, ccc, false, false, false, true
4, hhh, false, true, false, true
5, ddd, false, true, true, false
预期顺序是
2 (isSpecial = true)
1 (3A)
5 (2A, name = ddd)
4 (2A, name = hhh)
3 (1A)
你有什么想法或建议吗?
更新 请参阅下面评论中的 SQL 语句。
解决方案
您在 order by 子句中需要三个术语 - isSpecial、“isA”真理的数量和名称。假设您的数据库将 false 和 true 视为 0 和 1,我会这样做:
SELECT *
FROM docs
ORDER BY isSpecial DESC,
isA1 + isA2 + isA3 DESC,
name ASC
如果您的数据库不能像这样将布尔值隐式转换为整数,则必须将 isA 列替换为执行此逻辑的 case 表达式,然后再对它们求和。
推荐阅读
- server - using cytoscape on server
- algorithm - 每次修改后是否需要再次读取和存储稀疏矩阵?
- reactjs - 拖放不起作用打字稿反应
- terraform - 具有多个值的 Terraform AWS SSM 参数
- angular-material - Chrome 开发工具:屏幕尺寸与“元素 > 计算”尺寸
- controls - 在 Zoom 会议中向控件发送输入
- mongodb - 如何在 Kubernetes 集群中公开 MongoDB 副本集的远程连接
- laravel - Laravel/Jetstream 登录成功后更改管理员路由和 vie
- c# - 自引用表的导航属性
- docker - docker-compose、django 和 redis - 错误 111 连接被拒绝和错误 -3 名称解析临时失败