我有数据:
CREATE TABLE IF NOT EXISTS `sort` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`value` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `sort` (`id`, `value`) VALUES
(1, 'abc2'),
(2, 'abc20'),
(3, 'abc1'),
(4, 'abc10'),
(5, 'abc3');
我想让所有行从指定的 ID 开始,然后到该结果集的末尾,添加所有行,直到指定的 ID,并按值排序。
所以我想出了这个:
SET @id=3;
SELECT * FROM sort
ORDER BY
id=@id DESC, value>=(SELECT value FROM sort WHERE id=@id) DESC, value ASC;
一切正常,但不是自然的。通过上面的查询,我得到了结果 abc1, abc10, abc2, abc20, abc3
。我要查找的结果是 abc1, abc2, abc3, abc10, abc20
。当然,如果我更改 @id=4,结果应该是 abc10, abc20, abc1, abc2, abc3
。
通过下面的查询,我得到了我想要的自然排序。
SELECT * FROM sort ORDER BY LENGTH(value), value;
所以问题是:如何将两个 ORDER BY 子句合并为一个?
最佳答案
这应该有效:
SELECT *
FROM sort
ORDER BY
id=@id DESC,
LENGTH(value),
value>=(SELECT value FROM sort WHERE id=@id) DESC,
value ASC;`
关于MySql 自然排序与某个值的偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5714735/