如何在排序顶部获取NULL?

时间:2019-06-21 11:33:32

标签: mysql sql

定义了两个表:

CREATE TABLE `users` (
  `user_id` mediumint(6) unsigned NOT NULL AUTO_INCREMENT,
  `score` tinyint(1) unsigned DEFAULT NULL,
  PRIMARY KEY (`user_id`)
);

CREATE TABLE `online` (
  `user_id` mediumint(6) unsigned NOT NULL AUTO_INCREMENT,
  `url` varchar(255) NOT NULL,
  PRIMARY KEY (`user_id`)
);

如何组合表格,以便按分数字段从最大到最小的顺序对结果进行排序,但是在顶部则有值NULL的记录? 该查询不对第二个样本进行排序:

(SELECT * FROM `online` JOIN `users` USING(`user_id`) WHERE `score` IS NULL)
UNION
(SELECT * FROM `online` JOIN `users` USING(`user_id`) WHERE `score` IS NOT NULL ORDER BY `score` DESC)

4 个答案:

答案 0 :(得分:3)

在排序中使用两个键:

SELECT *
FROM `online` o JOIN
     `users`
     USING (user_id)
ORDER BY (`score` IS NULL) DESC, Score DESC;

MySQL在数字上下文中将布尔值视为数字,其中“ 1”为true,“ 0”为false。因此,DESC将真实值放在第一位。

顺便说一句,如果您使用UNION ALL而不是UNION,则您的版本看起来可以工作。但是,除非您明确拥有ORDER BY ,否则不能保证结果按任何特定顺序排列。

UNION会导致删除重复项并重新排列数据的开销。

答案 1 :(得分:1)

尝试:

select * from online join users using (user_id) order by ifnull(score, 10) desc;

答案 2 :(得分:0)

您可以在下面尝试-

select * from
(
SELECT *,1 as ord FROM `online` JOIN `users` USING(`user_id`) WHERE `score` IS NULL
UNION
SELECT *,2  FROM `online` JOIN `users` USING(`user_id`) WHERE `score` IS NOT NULL
)A ORDER BY ord asc,`score` DESC 

答案 3 :(得分:0)

您可以在SQL的末尾使用order by Nulls Last在第一个显示空值。