2015-02-09 3 views
0

У меня проблема с упорядочением моей таблицы за строкой с массивом цен. Ниже пример строки:MySQL порядок по первому элементу массива в строке

1) ;100 
2) ;50 
3) ;50;100;300 
4) ;30;150 

Я хочу заказать на первый элемент массива. Когда я заказываю по цене строк ASC я получаю:

1) ;100 
2) ;30;150 
3) ;50 
4) ;50;100;300 

Это неправильный результат, потому что «100» должен быть последним ... я попробовал:

ORDER BY CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(`price`, ';', 2), ';', 1) AS INT(3) ASC 

Но все-таки не так ... Любые ключ к разгадке?

+3

вы должны нормализовать дизайн вашего стола, что повлечет за собой эту проблему. –

+0

Я не могу изменить структуру этой базы ... Любая идея улучшить ORDER? –

ответ

1

Вы очень близки. Если бы я делал это, я хотел бы использовать (http://sqlfiddle.com/#!2/f57af/6/0)

ORDER BY 0+TRIM(LEADING ';' FROM price) 

Это работает, избавившись от любой точкой с запятой, затем (через 0+ трюк) обработки исходных символов из price столбца как целое, а не как текст.

Вы также могли бы сделать

ORDER BY 0+SUBSTRING_INDEX(SUBSTRING_INDEX(val,';',2), ';', -1) 

или

ORDER BY CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(val,';',2), ';', -1) AS INTEGER) 

У вас было две проблемы. Во-первых, вашему внешнему оператору SUBSTRING_INDEX нужен третий параметр -1. Во-вторых, вы лидируете как INTEGER, а не INT(3).

+0

Большое вам спасибо !!! –

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