mysql - Mysql的排序顺序
问题描述
我有 1 个表,其中包含 id、name 和威胁列,并且希望对威胁列使用 order by 子句。
威胁 1 是最高优先级,而 5 是最低优先级。很少有记录没有威胁得分并且得分为 Null。
因此,在屏幕上显示它时,用数值 6 减去威胁分数(如果威胁有价值),相同的值将用作威胁分数。
在按 asc 排序列威胁时,它选择第一个空值(无威胁)并按 desc 排序,它选择第一个值为 5(最低威胁)。
因此,对于 ASC,屏幕上的最终订单是(减去 6 后)。如果您在此处看到,威胁评分为 5 显示为最高,因为 SQL 发送记录按威胁评分排序。
+-------------+------------+
| screen data | Table data |
+-------------+------------+
| NULL | Null |
| 1 | 5 |
| 2 | 4 |
| 3 | 3 |
| 4 | 2 |
| 0 | 0 |
+-------------+------------+
已经尝试过ORDER BY threat * -1 ASC
,但它给出错误
BigInt 无符号错误超出范围
在这里,我的要求是在对记录进行排序时获得 1 作为最高记录的威胁评分,因为 NULL 有先例。
排序的预期行为(ASC 或 desc)
+--------+
| Threat |
+--------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 0 |
| NULL |
+--------+
--工作解决方案--
在这里有很棒的人的帮助下,下面的解决方案就像魅力一样。
ORDER BY IF (threat=0,6, ifnull(threat,6)) ASC ;
解决方案
在这种情况下,您必须处理NULL
值。NULL
处理值的方法很少。您可以将默认值更改为适合您使用的某个数字,在这种情况下,NULL
值将消失,您的问题将得到解决。另一种解决方案是有NULL
值但在查询表时处理它们。您可以使用IFNULL(expression, alt_value)
,在您的情况下,它将是:
IFNULL(threat, 6)
如果架构是:
CREATE TABLE IF NOT EXISTS `threat_table` (
`id` int(3) unsigned ,
`name` varchar(200),
`threat` int(3) unsigned
) DEFAULT CHARSET=utf8;
INSERT INTO `threat_table` (`id`, `name`, `threat`) VALUES
('1', 'test1', '5'),
('2', 'test2', NULL),
('3', 'test3', '4'),
('4', 'test4', '3'),
('5', 'test5', '2'),
('6', 'test6', '1');
你的查询是:
SELECT * from table order by IFNULL(threat, 6)
那么结果是令人满意的:
+----+-------+--------+
| id | name | threat |
+----+-------+--------+
| 6 | test6 | 1 |
| 5 | test5 | 2 |
| 4 | test4 | 3 |
| 3 | test3 | 4 |
| 1 | test1 | 5 |
| 2 | test2 | (null) |
+----+-------+--------+
看看这个小提琴。
更新:
如果威胁编号可以是 [1..5] 以外的任何值,我们可以使用以下查询:
select * from threat_table order by IFNULL(threat, ~0 >> 33)
推荐阅读
- java - 如何用JNI实例化共享指针来调用java实现
- java - Buggy Jar 的类加载问题
- javascript - 我有多个图像路径的数组,我想使用循环打印图像
- excel - 您可以使用 XLOOKUP 返回像 VLOOKUP 这样的相对列引用吗?
- python-3.x - 运行“$ python CommonModules/manage.py collectstatic --noinput”时出错
- amazon-web-services - DynamoDB 全局表备份和恢复
- python - ValueError:数据基数不明确。请提供具有相同第一维的数据
- microservices - API 和后台工作人员的微服务命名约定 (MessageBus/ScheduledTasks)
- react-native - 如何在 React Native Router Flux 的标签栏上添加一个虚拟图标?
- javascript - 如何防止来自浏览器控制台的 cookie 访问?