@xamelion1
Немного увлекаюсь программированием

Как сортировать по части строки?

Есть таблица с датами некоторые ячейки имеют такой вид:
18.07.2019
А некоторые такой:
18.07.2019/18.08.2019/24.06.2019
Как отсортировать с помощью order by сделать так что бы показывала по списку более раннее даты но и учитывала все даты в ячейке.
К примеру эта ячейка 18.07.2020 будет ниже чем эта 18.07.2032/18.08.2029/24.06.2019 потому что тут год ниже.
Конечно можно запихнуть все в массив и там уже делать выборку и сортировку но может есть какой то красивый элегантный способ ?
  • Вопрос задан
  • 386 просмотров
Пригласить эксперта
Ответы на вопрос 4
inoise
@inoise
Solution Architect, AWS Certified, Serverless
Нормализуй базу, вынеси даты в отдельную таблицу и работай уже с ней в нормальном формате, с join'ами. А не вот этот весь треш.
Ответ написан
BasiC2k
@BasiC2k
.NET developer (open to job offers)
По факту это не даты, а строка.
Ответ написан
Комментировать
tsklab
@tsklab
Здесь отвечаю на вопросы.
Ищите для вашей СУБД аналог STRING_SPLIT. Сделайте с её помощью представление с полем даты, соединяйте с основной таблицей и группируйте по нему.
Ответ написан
Комментировать
Immortal_pony
@Immortal_pony
ORDER BY LEAST(
    IF(SUBSTR(`date`, 1, 10)='', '9999-01-01', STR_TO_DATE(SUBSTR(`date`, 1, 10), '%d.%m.%Y')),
    IF(SUBSTR(`date`, 12, 10)='', '9999-01-01', STR_TO_DATE(SUBSTR(`date`, 12, 10), '%d.%m.%Y')),
    IF(SUBSTR(`date`, 23, 10)='', '9999-01-01', STR_TO_DATE(SUBSTR(`date`, 23, 10), '%d.%m.%Y'))
)


Количество IF-ов должно быть равно максимально возможному количеству дат в строке.
Это количество можно узнать, выполнив следующий запрос:
SELECT 
    MAX(ROUND((LENGTH(`date`) - LENGTH(REPLACE(`date`, '/', ''))) / LENGTH('/')))+1 AS 'max' 
FROM 
    `dates`

... где `dates` - название таблицы, а `date` - название поля
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы