2016-09-17 30 views
1

我正在爲我的女朋友業務開發一個優惠券插件。 voucher-id(vid)看起來像這個2016-1,第一部分是當前年份,第二部分是當前的憑證ID。MySQL + PHP通過組合字符串排序

我現在的問題是訂購vids ASC/DESC。

輸出現在是:

- 2016-1 
- 2016-10 
- 2016-11 
- 2016-12 
- 2016-13 
- 2016-2 
- 2016-20 
- 2016-21 
- etc. 

,但它應該是:

- 2016-1 
- 2016-2 
- 2016-.. 
- 2016-9 
- 2016-10 
- 2016-11 
- 2016-.. 
- 2016-19 
- 2016-20 
- 2016-21 
- 2016-.. 

我覺得鑄造是因爲沒有選擇 「 - 」。

希望任何人都可以幫助我!

問候

M.

+0

都是這種格式('XXXX-yy')所有的數據? – 1000111

+0

是的,我需要這種格式的vid,因爲它之後也會打印在憑證上。 – themca

+0

只是想知道,爲什麼你把它稱爲一個憑證_plugin_? – SOFe

回答

3

如果這種格式(xxxx-yy),那麼你可以通過子句嘗試按以下順序您的所有數據:

ORDER BY SUBSTRING_INDEX(your_column,'-',1)+0, 
SUBSTRING_INDEX(your_column,'-',-1)+0 

示範:

SET @str := '2016-01'; 

SELECT 
SUBSTRING_INDEX(@str,'-',1)+0 AS firstPart, 
SUBSTRING_INDEX(@str,'-',-1)+0 AS secondPart; 

輸出:

firstPart secondPart 
    2016   1 

注:

第一substring_index功能抓住了連字符之前的文本和第二substring_index功能抓住了連字符後的文本。

稍後將0加到它將其轉換爲數字。

更多:或者您可以使用CAST功能象下面這樣:

ORDER BY 
CAST(SUBSTRING_INDEX(your_column,'-',1)) AS UNSIGNED) , 
CAST(SUBSTRING_INDEX(your_column,'-',-1)) AS UNSIGNED) 
+0

這兩條線有什麼區別? – themca

+0

如果排序是xxxx-yyy,該怎麼辦? – themca

+0

第一個'substring_index'函數在連字符之前抓取文本,第二個'substring_index'函數抓取連字符之後的文本。稍後向其添加「0」將其轉換爲數字。 – 1000111

1

你應該做到像voucherid - year周圍的其他方法。然後排序會起作用。

或者,如果你想保持一致,嘗試這樣的事情

ORDER BY 
    CAST(SUBSTRING(voucher, 5) AS INT) DESC 

其中1,5是「2016-」,所以它的訂單通過什麼是後:憑證編號。

+0

與上面相同的問題:如果幾周後憑證編號如下所示:100-2016,101-2016? – themca

+0

這很好......如果你決定去推薦我的第一個建議,你現在正在做什麼^^? (在一年之前獲得優惠券),那麼不需要其他任何東西:)如果你確實選擇了其他選項,那麼只有在幾十年和幾十年的時間(10000)時纔會中斷,因此你不必擔心太多關於這個:) –

+0

身份證上的第一個地方沒有影響sry:/ thx然後thx您的幫助:D – themca