Правильная сортировка конкатных значений MYSQL

#mysql #sorting #concatenation

#mysql #сортировка #объединение

Вопрос:

После выполнения простых вычислений col1 / col2, а затем использования CONCAT для добавления буквального % знака, я не могу успешно отсортировать их по порядку.

Первоначально мои результаты, отсортированные DESC , были похожи

 9%
8%
75%
65%
100%
  

После обновления:

    CASE WHEN ROUND(col1/col2 *100) = 100 
        THEN CONCAT(100, '%') 
        ELSE LPAD(CONCAT(ROUND(col1/col2 *100),'%'),3,'0') 
        END AS Percent
  

Я смог успешно отсортировать столбцы с одной и двузначной цифрой, добавив 0 перед однозначной цифрой, но у меня осталось 100 не на своем месте

 75%
65%
09%
08%
100%
  

Мысли?

Комментарии:

1. В чем вы это отображаете? вы должны вернуть отсортированное десятичное значение и разрешить пользовательскому интерфейсу обрабатывать формат отображения. Причина, по которой это не работает, заключается в том, что число теперь сортируется как символьные данные. хотя я в замешательстве, почему это не 75, 65, 100, 09, а затем 08… Я думаю, это будет зависеть от того, как вы выполняете сортировку…

2. @xQbert, я пытаюсь отобразить результаты с буквальным знаком % в качестве его условного процента.

3. Я понимаю это; но отобразите это «ГДЕ» конечный пользователь будет работать в базе данных MySQL? вы используете PHP для подключения и рендеринга, Java? asp, jsp, rails?? Независимо от того, что это за приложение, которое подключается к базе данных, должно прочитать набор записей, а затем отформатировать вывод для правильного отображения. Теперь, если вы просто хотите, чтобы это отображалось таким образом в MySQL….

4. выберите name, concat(pid, ‘%’) из mytable, где порядок условий по pid desc (а pid — целое число) в моей таблице работает нормально. Давайте посмотрим, как вы ОПИСЫВАЕТЕ your_table и ваш ВЫБОР… Синтаксис объединения.

5. В грубом приближении нет проблемы, для решения которой функции CONCAT (или GROUP_CONCAT) MySQL являются решением.

Ответ №1:

Кажется, вы уже добавили % символ к значениям, поэтому вы можете получить их без % знака, а затем отсортировать их и добавить % знак обратно. Ниже приведен рабочий и протестированный пример SQL.

 select concat(percentage, '%') -- add '%' sign
from (
select SUBSTRING_INDEX(percentage, '%', 1) percentage  -- remove `%`
from percentage_sorting) t
order by percentage;  -- order by values
  

Ответ №2:

Как только вы преобразуете свои проценты в строки, вы в основном получите алфавитный порядок, который обычно не соответствует тому, что вы хотите для чисел:

 20%
2%
12%
1%
  

Если вы хотите числовую сортировку, вам нужно выполнить сортировку по фактическим числам:

 SELECT CONCAT(percentage, '%')
FROM data
ORDER BY percentage DESC