2012-02-15 3 views
2

результата, показанный в настоящее время: требуетсяКак отобразить восходящий или нисходящий за содержание показанного в MySQL

1234/45/67-9 
1234/45/67-8 
1234/45/67-7 
1234/45/67-6 
1234/45/67-5 
1234/45/67-4 
1234/45/67-3 
1234/45/67-22 
1234/45/67-2 
1234/45/67-10 
1234/45/67-1 
1234/45/67 

выхода:

1234/45/67-22 
1234/45/67-10 
1234/45/67-9 
1234/45/67-8 
1234/45/67-7 
1234/45/67-6 
1234/45/67-5 
1234/45/67-4 
1234/45/67-3 
1234/45/67-2 
1234/45/67-1 
1234/45/67 



SELECT invoiceNo 
FROM invoice 
WHERE invoiceNo LIKE '1234/45/67%' 
ORDER BY invoiceNo DESC 

я хочу выход быть показан в убывающем, но она не в состоянии показать должным образом? как его достичь?

ответ

2

Если префикс всегда 10 символов, то вы можете нарезать его с substring и тайным вторым куском к ряду с cast:

select invoiceno 
from invoice 
where invoiceno like '1234/45/67%' 
order by substring(invoiceno from 1 for 10), 
     cast(substring(invoiceno from 11) as decimal); 

Кастинг второй части к числу получает их сортировать, как цифры, а не строки, так что -10 предшествует -1, а не наоборот. Если вы всегда будете использовать префикс вида 9999/99/99 в вашем ИНЕКЕ, то вы можете упростить ORDER BY:

select invoiceno 
from invoice 
where invoiceno like '1234/45/67%' 
order by cast(substring(invoiceno from 11) as decimal); 
+0

получил сомнение, если таблица содержит тысячи строк, потребуется больше времени для загрузки для этого запроса ??? – dude

+0

@dude: вызов подстроки не является бесплатным. Если он становится слишком дорогим, вы, вероятно, захотите разбить 'invoiceno' на два отдельных столбца, чтобы вы могли сортировать их без перебора строк. –

+0

как его достичь? если я столкнулся с такой проблемой – dude

1

Используйте вспомогательный вычисляемое поле оттенок integer, как это:

SELECT invoiceNo, CAST(SUBSTR(invoiceNo FROM 11) AS INT) AS invoiceNumber 
FROM invoice 
WHERE invoiceNo LIKE '1234/45/67%' 
ORDER BY invoiceNumber DESC 
0

Попробуйте этот запрос -

SELECT * FROM (
    SELECT invoiceNo, 
    @third_part:=SUBSTRING_INDEX(invoiceno, '/', -1) tp 
    FROM 
    invoice 
    WHERE 
    invoiceNo LIKE '1234/45/67%' 
) t 
ORDER BY 
    SUBSTRING_INDEX(tp, '-', 1) * 1 DESC, 
    IF (LOCATE('-', tp) = 0, 0, SUBSTRING_INDEX(tp, '-', -1) * 1) DESC 
0

Попробуйте этот запрос

SELECT invoiceNo 
FROM invoice 
ORDER BY cast(substring(invoiceNo from 11) as decimal) ASC 
Смежные вопросы