MySql 自然排序与某个值的偏移量

标签 mysql offset natural-sort

我有数据:

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/

相关文章:

c++ - struct 非数组成员的 size_t 转换崩溃

jquery - 根据元素当前偏移更改不透明度

mysql - 防止所有非唯一列的重复行(仅限 MySQL)?

mysql - 计算标准化表中的记录数

PHP:更新和替换数据库中的行

UINavigationController 更改推送的 UIViewController View 的位置

sql - 如何在同一字段中先按数字排序查询,然后再按字符串排序

php - MySQL/PHP 自然排序

SQL字母数字排序问题

php - 按点赞数列出评论