MySQL + PHP顺序组合字符串

时间:2016-09-17 09:22:21

标签: mysql sorting

我正在为我的女朋友业务开发一个凭证插件。 voucher-id(vid)看起来像2016-1,第一部分是当前年份,第二部分是当前的凭证ID。

我现在的问题是订购视频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-..

我认为由于" - "。

,铸造是不可取的

希望有人能帮助我!

问候

微米。

2 个答案:

答案 0 :(得分:3)

如果您使用此格式的所有数据(xxxx-yy),那么您可以尝试以下order by子句:

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) 

答案 1 :(得分:1)

你应该像voucherid - year那样反过来。然后订购将有效。

或者,如果你想保持不变,试试这样的事情

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

其中1,5是“2016-”所以它按照之后的任何顺序命令:凭证ID。