按规则创建自定义SQL顺序

时间:2011-02-16 00:23:35

标签: sql mysql indexing sql-order-by

我正在做一个基本的选择操作,检索MySQL数据库中的varchar列。存储在列中的值是“作业编号”,并且都具有以下形式:

Ĵ## - ####

前两个#符号表示作业发生年份的最后两位数,后四个表示作业创建的顺序。

以下是工作号码的示例:

J11-0152(2011年创造的第152个职位)。接下来是J11-0153 ......

假设记录以随机顺序存储,是否可以检索记录,排序以便最近的作业首先显示?

e.g。 表中的记录按以下顺序存储:

 1. J09-1893
 2. J11-1323
 3. J08-0011
 4. J09-0234
 5. J10-1232
 6. J11-1111

将检索为:

 1. J11-1323
 2. J11-1111
 3. J10-1232
 4. J09-1893
 5. J09-0234
 6. J08-0011

我对可以在MySQL中完成的任何解决方案持开放态度。我正在使用CakePHP作为应用程序框架,所以如果有人知道一个聪明的蛋糕解决方案也可以解决问题。

4 个答案:

答案 0 :(得分:2)

2位数的日期和工作号码仍应正确排序,甚至按字典顺序排列。但是,如果你涉及2000之前的数据,那么你需要这个:

(包括样本表 - 只是忽略)

drop table if exists jobnumbers ;
create table jobnumbers (id int primary key, number varchar(10)); 
insert jobnumbers values
(  1, 'J09-1893'),
(  2, 'J11-1323'),
(  3, 'J08-0011'),
(  4, 'J09-0234'),
(  5, 'J10-1232'),
(  6, 'J11-1111'),
(  9, 'J99-1111');

select *
from jobnumbers
order by 
  case when number>'J5' then 1900 else 2000 end desc, number desc;

至于indexing(因为你标记了它),有两个选项:

  1. 您必须将其拆分为多个列才能索引年份,然后编号
  2. 使用4位数年份。

答案 1 :(得分:1)

首先:

CREATE INDEX idx_table_jobnumber ON table (jobnumber);

然后:

select jobnumber FROM table ORDER BY jobnumber DESC

“可怕的失败”对我来说意味着“很慢”。

答案 2 :(得分:1)

使用SUBSTRING()获取您感兴趣的字符串部分:

SELECT SUBSTRING(myFieldName, from, to) AS myFieldAlias ORDER BY myFieldAlias DESC

所以在你的情况下它应该是:

SELECT SUBSTRING(job_number, 1, 3) as location, SUBSTRING(job_number, 5, 4) AS jobno ORDER BY location DESC, jobno DESC

答案 3 :(得分:0)

再次尝试jobnumber DESC查询,或说明失败的原因。可能提供不准确的样本输出。