Сортировка двойных значений из базы данных

#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 предоставляет множество возможностей для таких ситуаций