У меня есть таблица MySQL, которую я хотел бы отображать уменьшающимся образом. Проблема в том, что идентификатор разбит тире... Поэтому MySQL не понимает мой запрос.
SELECT * FROM table WHERE id ORDER BY id DESC
Результаты
20633-18489
184945-190028
183661-188782
1575-1610
но я хочу этот заказ
184945-190028
183661-188782
20633-18489
1575-1610
Что такое решение в php?
В инструкции SQL мы могли бы сделать это:
ORDER BY id + 0 DESC
или это:
ORDER BY SUBSTRING_INDEX(id,'-',1) + 0 DESC
" + 0
" будет вызывать строку перед ее вычислением в числовом контексте. Это вернет число. И тогда упорядочение будет по числовому значению.
В качестве демонстрации
SELECT t.id
, t.id + 0 AS id0
, SUBSTRING_INDEX(t.id,'-',1)+0 AS id1
FROM ( SELECT '184945-190028' AS id
UNION ALL SELECT '183661-188782'
UNION ALL SELECT '20633-18489'
UNION ALL SELECT '1575-1610'
) t
ORDER BY t.id + 0 DESC
возвращается
id id0 id1
------------- ------ ------
184945-190028 184945 184945
183661-188782 183661 183661
20633-18489 20633 20633
1575-1610 1575 1575
Примечание: это заказ только со стороны id
перед тире. Это не указывает, какие значения идентификатора заказа, которые "соответствуют" в главной части будут возвращены. MySQL будет иметь право возвращать эти два в любом порядке.
456-42
456-321
Мы можем добавить больше выражений в предложение ORDER BY, чтобы сделать порядок этих детерминированных.
То, что вы ищете, - это REPLACE()
поэтому ваш запрос будет выглядеть так:
SELECT *, REPLACE(id, '-' , '') AS sortable_id WHERE id ORDER BY sortable_id DESC