我正在做一个基本的选择操作,检索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作为应用程序框架,所以如果有人知道一个聪明的蛋糕解决方案也可以解决问题。
答案 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 :(得分: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
查询,或说明失败的原因。可能提供不准确的样本输出。