2016-09-17 1 views
1

Я разрабатываю ваучер-плагин для бизнеса моей подруги. идентификатор ваучера (vid) выглядит так: 2016-1, первая часть - текущий год, а вторая часть - текущий идентификатор ваучера.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-.. 

Я думаю, что кастинг не вариант из-за "-".

Надеюсь, что кто-нибудь может мне помочь!

рассматривает

М.

+0

ли все данные в этом формате ('хххх-yy')? – 1000111

+0

Да, мне нужен вид в этом формате, потому что он также будет напечатан на ваучере после этого. – 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

id на первое место не имел эффекта sry:/тем не менее thx за вашу помощь: D – themca

Смежные вопросы