我有一个MySQL表,其中有两个组成主键的字段和一个"排序"字段.这些都不是自动递增的.
当你在没有指定ORDER BY子句的情况下对表进行查询时,它会按照放入的顺序拉出数据 - 非常标准.因此,无论先插入哪一行,都会先将它们拉出来.
问题是,当我ORDER BY sort ASC,如果sort为null,那么它实际上根本不排序,结果就变得混乱了.但是我想让备份ORDER BY成为默认订单,否则它将退出.我不能将备份作为自动递增的"ID"字段,因为没有自动递增ID字段.主键只是两个外键的组合.
- - -编辑 - - -
CREATE TABLE IF NOT EXISTS `product_attribute_select_value` ( `product_attribute_id` int(11) NOT NULL, `attribute_select_value_id` int(11) NOT NULL, `sort` int(11) default '0', PRIMARY KEY (`product_attribute_id`,`attribute_select_value_id`), KEY `product_attribute_select_value_FI_2` (`attribute_select_value_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; ALTER TABLE `product_attribute_select_value` ADD CONSTRAINT `product_attribute_select_value_FK_1` FOREIGN KEY (`product_attribute_id`) REFERENCES `product_attribute` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `product_attribute_select_value_FK_2` FOREIGN KEY (`attribute_select_value_id`) REFERENCES `attribute_select_value` (`id`);
数据被插入,当没有ORDER BY子句被拉出时,它按照它被放入的顺序出现.当有一个ORDER BY子句和所有sort值时0,它以看似随机的顺序将其拉出.
首先,重要的是要知道,在没有ORDER BY子句的情况下,SQL标准没有规定SQL实现以任何特定顺序生成行,实际上甚至没有期望生成的顺序是对于类似的查询一致!
因此,依赖于实现提供的"自然顺序"的概念通常是危险的,除非特定DBMS生产者明确记录(我不相信MySQL的情况),这种"自然顺序"可能随时更改(任何新版本,数据库中的任何内容更改,甚至!)
但是,有一个处理空值的技巧:
ORDER BY COALESCE(sort, 'zzzzzzz')
Run Code Online (Sandbox Code Playgroud)
其中'zzzzzz'是一个大于或小于"sort"列的任何预期值的值,在将末尾行放在末尾或开头时进行限制.我们通常使用这种技术来覆盖MySQL的默认行为,即将NULL值视为最小值,因此首先放在"ASC"排序中,最后放在"DESC"排序中.
这在MySQL文档中使用null值.
也可以为排序添加一个额外的列,可能是类似的
ORDER BY COALESCE(sort, 'zzzzzzz') , id
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1693 次 |
| 最近记录: |