#php #mysql #database #sorting
#php #mysql #База данных #сортировка
Вопрос:
В базе данных я храню записи, которым присваиваются коды (двойной формат). При вызове записей из базы данных я бы хотел, чтобы они были отсортированы от наименьшего к наибольшему.
Проблема возникает, когда 1.2> 1.10, что понятно. Я бы хотел, чтобы это интерпретировалось следующим образом: 1.10> 1.2
Я попытался сделать это, изменив тип на ТЕКСТ. Добавление пробелов в конце «кода».
У меня есть идея разделить числа на сегменты и, если первый сегмент равен, отсортировать по второму сегменту. Это кажется логичным, но я не знаю, как перевести это в код.
Кто-нибудь может помочь?
Комментарии:
1. Это выглядит немного сложным для выполнения в SQL, вы не возражаете, если это будет сделано в PHP при поступлении данных? Если это так, восстановите их в виде текста, тогда хорошим началом было бы сделать
explode('.', $code);
2. Эти «числа» хранятся как varchar, верно?
3. Пробовал хранить как «varchar, text и т. Д.».
4. Как вы можете иметь значение
1.10
вdouble
типе? это было бы усечено до1.1
. Итак, как бы вы узнали, было ли это1.1
,1.10
,1.100
,...
?5. Я знаю, поэтому я написал, что мне понятно, почему это происходит. Кстати, смена типа не помогает.
Ответ №1:
если ваши коды содержат допустимое десятичное значение, вы можете попробовать преобразовать коды по порядку в виде пары целых чисел
select codes
from my_table
order by ( CAST(left(codes, locate('.', codes)-1 ) AS UNSIGNED),
CAST(right(codes, length(codes -locate('.', codes)) AS UNSIGNED))
Комментарии:
1. не приведет ли это к
1.2 > 1.10
тому, чего OP хочет избежать?2. @Kaddath спасибо .. вы правы . ответ обновлен для разделения на отдельные целые числа, так что 2 < 10 (и 1.2 < 1.10 =
3. Это элегантное решение, это проще, чем я думал
4. @Kaddath ..tnanks mysql предоставляет множество возможностей для таких ситуаций