定义了两个表:
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)
答案 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
在第一个显示空值。