【问题标题】:Custom ordering SQL自定义排序 SQL
【发布时间】:2016-01-11 13:40:29
【问题描述】:

我想在很多地方按 1、1a、1b、2、2a、2b 的顺序订购东西。我正在考虑以下选项:

1:对 1, 1a, 1b, 2, 2a, 2b, ... 使用枚举字段,这样它就可以很好地排序。在不同的地方定义这样的枚举的缺点。

2:创建一个包含两个字段的额外表。一个字符串字段,其值为 1、1a、1b、2、2a、2b,... 以及一个订单索引,并在需要排序的任何地方与该表联合。缺点是工会很多。

您会建议哪些选择,或者您是否考虑其他选择?

谢谢

【问题讨论】:

  • 当您说“工会”时,我相信您的意思是JOINs?另外,排序是否在所有地方都遵循特定的算法?例如,所有值是否总是 ?

标签: mysql sql enums


【解决方案1】:
DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,string VARCHAR(12) NOT NULL);

INSERT INTO my_table (string) VALUES ('2b'),('1'),('2a'),('1b'),('1a'),('11');

SELECT * FROM my_table;
+----+--------+
| id | string |
+----+--------+
|  1 | 2b     |
|  2 | 1      |
|  3 | 2a     |
|  4 | 1b     |
|  5 | 1a     |
|  6 | 11     |
+----+--------+

SELECT * FROM my_table ORDER BY string + 0,string;
+----+--------+
| id | string |
+----+--------+
|  2 | 1      |
|  5 | 1a     |
|  4 | 1b     |
|  3 | 2a     |
|  1 | 2b     |
|  6 | 11     |
+----+--------+

【讨论】:

  • 感谢这个不错的解决方案!
【解决方案2】:

尝试使用以下代码进行排序:

SELECT * FROM t ORDER BY st REGEXP '^[[:alpha:]].*', st+0, st ;

希望对你有帮助

【讨论】:

  • 这段代码为什么以及如何提供帮助?请解释它在做什么,为什么它比问题中已经列出的 OP 更好。在这种形式下,这不是一个好的答案。请阅读help center 中的How to Answer 了解更多信息。 (附带说明,此解决方案不适用于大型数据集,因为它会阻止服务器使用任何索引来执行将导致文件排序的排序。)
猜你喜欢
  • 2014-04-29
  • 2021-07-25
  • 1970-01-01
  • 2014-06-30
  • 2019-12-06
  • 2010-12-24
  • 1970-01-01
相关资源
最近更新 更多