MySQL порядок по пункту странная проблема - PullRequest
0 голосов
/ 28 января 2011

Я пытаюсь упорядочить данные в таблице, используя следующий запрос:

выбор * из заказа клиентов по CUST desc

Все записи упорядочены правильно, кроме: CUST.10 Как сделать так, чтобы CUST.10 показывался вверху, а затем CUST.9, CUST.8 и т. Д.

weird mysql ordering

Ответы [ 6 ]

4 голосов
/ 28 января 2011

Попробуйте это:

SELECT * 
  FROM customers 
 ORDER BY CAST(SUBSTRING_INDEX(CUST, '.', -1) AS SIGNED) DESC

Рабочий пример:

SELECT * FROM
(
SELECT 'CUST.10' CUST 
UNION
SELECT 'CUST.9' CUST 
UNION
SELECT 'CUST.1' CUST 
) A ORDER BY CAST(SUBSTRING_INDEX(CUST, '.', -1) AS SIGNED) DESC
1 голос
/ 28 января 2011

Подумайте о том, чтобы поместить число, которое вы добавили в строку Cust, в целочисленный столбец. Прямо сейчас SQL выполняет алфавитно-цифровую сортировку в столбце varchar CUST. Это сортировка с алфавитно-цифровым приоритетом в каждом символьном индексе. Если вы сортируете по целому столбцу, вы получите то, что хотите.

1 голос
/ 28 января 2011

это сортировка на основе строкового значения, а не числа. если вы можете разделить число на числовое значение, то вместо этого вы можете отсортировать его.

0 голосов
/ 28 января 2011

Вам нужно разделить имя на части имени и номера.
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring-index

SELECT *
FROM CUSTTEST
ORDER BY
    SUBSTRING_INDEX(CUST,'.',1),
    1*SUBSTRING_INDEX(CUST,'.',-1) DESC

Используя образец

create table CUSTTEST (CUST varchar(20));
insert CUSTTEST VALUES
 ('CUST.10'),('CUST.3'),('CUST.9'),('CUST.1'),
 ('BOB.11'),('BOB.13'),('BOB.2'),('BOB.5'),
 ('CYBERKIWI.11'),('CYBERKIWI.1');
0 голосов
/ 28 января 2011

Не только сложно прогнозировать сортировку по строковым значениям, но и это неэффективно. Вы действительно должны подумать об изменении схемы и создании целочисленного столбца для идентификатора клиента. Может также случиться так, что у вас уже есть этот столбец где-то в качестве ключа, а затем определенно продолжайте и сортируйте по этому столбцу.

0 голосов
/ 28 января 2011

С этим типом данных вы не можете, естественный порядок строк (при условии, что тип данных - строка) приводит к тому, что 10 меньше 2 ..., поскольку он сравнивает отдельные символы, начиная с первого символа.В качестве решения принимается первое неравное сравнение.

Чтобы решить проблему, вам придется либо использовать какое-то другое поле данных, либо сделать это числовое поле.

...