首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql排序顺序

Mysql排序顺序
EN

Stack Overflow用户
提问于 2019-06-11 05:03:35
回答 5查看 83关注 0票数 0

我有一个表,其列为id、name和威胁&希望对威胁列使用order子句。

威胁1是最高优先级,5是最低优先级。很少有记录不会有威胁得分和零得分。

因此,在屏幕上显示它时,用数值6减去威胁分数(如果威胁有值),同样也将用作威胁分数。

在按asc对列威胁进行排序时,它首先选择空值(无威胁),然后按desc排序,其第一个值为5(最低威胁)。

因此,屏幕上的最终订单是ASC (减去6)。如果您在这里看到,威胁评分与5显示为顶部,因为SQL发送记录按威胁得分排序。

代码语言:javascript
复制
+-------------+------------+
| 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)

代码语言:javascript
复制
+--------+
| Threat | 
+--------+
|   1    |
|   2    |
|   3    |
|   4    |
|   5    |
|   0    |
|  NULL  |
+--------+

-工作方案

在这里令人敬畏的人的帮助下,下面的解决方案就像魅力一样有效。

代码语言:javascript
复制
ORDER BY IF (threat=0,6, ifnull(threat,6)) ASC ; 
EN

回答 5

Stack Overflow用户

发布于 2019-06-11 05:28:40

在这种情况下,您必须处理NULL值。处理NULL值的方法不多。您可以将默认值更改为适合您使用的值,在这种情况下,NULL值将消失,您的问题将得到解决。另一种解决方案是拥有NULL值,但在查询表时处理它们。您可以使用IFNULL(expression, alt_value),在您的情况下,它将是:

代码语言:javascript
复制
IFNULL(threat, 6)

如果模式是:

代码语言:javascript
复制
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');

您的查询是:

代码语言:javascript
复制
SELECT * from table order by IFNULL(threat, 6)

结果令人满意:

代码语言:javascript
复制
+----+-------+--------+
| id | name  | threat |
+----+-------+--------+
|  6 | test6 | 1      |
|  5 | test5 | 2      |
|  4 | test4 | 3      |
|  3 | test3 | 4      |
|  1 | test1 | 5      |
|  2 | test2 | (null) |
+----+-------+--------+

看看这把小提琴

更新:

如果威胁号可以是大于1.5的任何值,我们可以使用以下查询:

代码语言:javascript
复制
select * from threat_table order by IFNULL(threat, ~0 >> 33)
票数 2
EN

Stack Overflow用户

发布于 2019-06-11 05:10:01

请使用ifnull()函数。在选择查询中用适当的值替换null值。

票数 1
EN

Stack Overflow用户

发布于 2019-06-11 05:38:41

代码语言:javascript
复制
SELECT *       
FROM TableName
ORDER BY (CASE
            WHEN ColumnName IS NULL THEN 1 
            ELSE 0 
          END), 
         ColumnName

我希望这能行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56536792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档