2011-02-16 94 views
1

我正在做一個基本的選擇操作,檢索MySQL數據庫中的varchar列。存儲在列中的值是「作業號」,和所有的格式如下:按規則創建自定義SQL順序

J ##代 - ####

其中前兩個#跡象表明今年的工作花的最後兩位數字地點,最後四個代表作業的創建順序。

這裏是一個什麼樣的職位數量可能看起來像一個例子:

J11-0152(2011年創建的第152任務)。下一個將是J11-0153 ...

假設記錄以隨機順序存儲,是否有檢索記錄,排序,以便最近的工作首先顯示?

例如 在表中的記錄存儲在這個順序:

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

我願意,可以在MySQL來完成的任何解決方案:爲

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

將被檢索。我使用CakePHP作爲應用程序框架,所以如果有人知道可以解決問題的巧妙解決方案。

+0

順便說一句,'SELECT jobnumber ORDER BY jobnumber DESC'可怕地失敗 – Adam 2011-02-16 00:25:16

+0

它以哪種方式失敗? – awm 2011-02-16 00:29:17

回答

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

第一:

CREATE INDEX idx_table_jobnumber ON table (jobnumber); 

然後:

select jobnumber FROM table ORDER BY jobnumber DESC 

「可怕的失敗」 的意思是 「慢」 給我。

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 
0

再次嘗試jobnumber DESC查詢,或者說爲什麼失敗。可能會提供不準確的示例輸出。