按规则创建自定义SQL订单
我正在执行一个基本的select操作,检索MySQL数据库中的varchar列。列中存储的值是作业编号,所有值的格式如下: J- 其中前两个符号表示工作发生年份的最后两位数字,后四个符号表示工作产生的顺序 以下是一个工作编号的示例: J11-0152是2011年创造的第152个工作岗位。下一个是J11-0153 假设记录是以随机顺序存储的,那么是否有其他方法可以检索记录,并进行排序,以便首先显示最新的作业 e、 g。 表中的记录按以下顺序存储:按规则创建自定义SQL订单,sql,mysql,indexing,sql-order-by,Sql,Mysql,Indexing,Sql Order By,我正在执行一个基本的select操作,检索MySQL数据库中的varchar列。列中存储的值是作业编号,所有值的格式如下: J- 其中前两个符号表示工作发生年份的最后两位数字,后四个符号表示工作产生的顺序 以下是一个工作编号的示例: J11-0152是2011年创造的第152个工作岗位。下一个是J11-0153 假设记录是以随机顺序存储的,那么是否有其他方法可以检索记录,并进行排序,以便首先显示最新的作业 e、 g。 表中的记录按以下顺序存储: 1. J09-1893 2. J11-1323
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作为应用程序框架,因此,如果有人知道一个聪明的蛋糕解决方案也可以解决这个问题。首先:
CREATE INDEX idx_table_jobnumber ON table (jobnumber);
然后:
严重失败对我来说意味着速度慢。首先:
CREATE INDEX idx_table_jobnumber ON table (jobnumber);
然后:
严重失败意味着对我来说速度很慢。使用子字符串获取您感兴趣的字符串部分:
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
使用子字符串获取您感兴趣的字符串部分:
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
请再次尝试jobnumber DESC查询,或说明其失败的原因。可能提供了不准确的示例输出。请再次尝试jobnumber DESC查询,或说明其失败的原因。可能提供了不准确的示例输出。两位数的日期和工作编号仍应正确排序,即使是按字典排序。但是,如果涉及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;
对于标记后的索引,有两个选项:
您必须将其拆分为多个列,以便能够根据年份、然后是工作编号编制索引
使用4位数的年份。
两位数的日期和工作编号仍然应该正确排序,即使是按字典排序。但是,如果涉及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;
对于标记后的索引,有两个选项:
您必须将其拆分为多个列,以便能够根据年份、然后是工作编号编制索引
使用4位数的年份。
顺便说一句,“按jobnumber描述选择jobnumber ORDER”失败非常严重,如果代码意味着最好将PARAT存储在单独的字段中-您可以更改模式吗?如果您有2000年以前的数据,则仅失败。BY fails我的意思是,它检索到的订单与我的订单不同want@Adam:对于我和你的示例,它按我想要的顺序检索:顺便说一句,“按jobnumber DESC选择jobnumber ORDER”失败非常严重如果代码意味着最好将PARAT存储在单独的字段中-您可以更改模式吗?仅当您有2000年以前的数据时才会失败。BY fails我的意思是,它检索到的订单与我的订单不同want@Adam:对于我和您的示例,它检索的顺序是想要:聪明。事实证明,这些数字的排序是正确的,但2000年以前的数字才是问题所在。事实证明,这些数字的排序是正确的,但2000年以前的数字才是问题所在