Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按规则创建自定义SQL订单_Sql_Mysql_Indexing_Sql Order By - Fatal编程技术网

按规则创建自定义SQL订单

按规则创建自定义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

我正在执行一个基本的select操作,检索MySQL数据库中的varchar列。列中存储的值是作业编号,所有值的格式如下:

J-

其中前两个符号表示工作发生年份的最后两位数字,后四个符号表示工作产生的顺序

以下是一个工作编号的示例:

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作为应用程序框架,因此,如果有人知道一个聪明的蛋糕解决方案也可以解决这个问题。

首先:

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年以前的数字才是问题所在