Как сортировать текстовые поля с помощью чисел и маркеров

У меня есть следующая таблица:

 +----+-----------------------------------------+----------+
 | id | sort                                    |  channel |
 +----+-----------------------------------------+----------+
 | m2 | ["m2","1","2","11","m4","m3","m5","m1"] | E        |
 | 2  | ["m2","1","2","11","m4","m3","m5","m1"] | H2       |
 | 1  | ["m2","1","2","11","m4","m3","m5","m1"] | H1       |
 | 11 | ["m2","1","2","11","m4","m3","m5","m1"] | H3       |   
 | m4 | ["m2","1","2","11","m4","m3","m5","m1"] | S1       |
 | m3 | ["m2","1","2","11","m4","m3","m5","m1"] | C3       |
 | m5 | ["m2","1","2","11","m4","m3","m5","m1"] | M4       |
 | m1 | ["m2","1","2","11","m4","m3","m5","m1"] | G6       |
 +----+-----------------------------------------+----------+

Использование MySQL-запроса:

 SELECT id, sort, channel FROM (SELECT s.id, c.sort, s.channel FROM streams s, channels c WHERE JSON_SEARCH(s.bouquet, 'one', 1) IS NOT NULL AND JSON_SEARCH(c.bouquet, 'one', 1) IS NOT NULL AND JSON_SEARCH(c.sort, 'one', s.id) IS NOT NULL UNION SELECT m.marker, c.sort, m.channel FROM markers m, channels c, streams s WHERE JSON_SEARCH(m.bouquet, 'one', 1) IS NOT NULL AND JSON_SEARCH(c.bouquet, 'one', 1) IS NOT NULL AND JSON_SEARCH(c.sort, 'one', m.marker) IS NOT NULL) ch ORDER BY LOCATE(id, CONCAT("'", sort, "'"));

Я получил приведенный выше результат таблицы, и мне нужно отсортировать идентификатор, используя поле сортировки... поэтому вывод должен быть:

| id |
------
  m2
  1
  2
  11
  m4
  m3
  m5
  m1

Я думаю, что проблема в следующем: ORDER BY LOCATE(id, CONCAT("'", sort, "'")) но я пытаюсь изменить запрос без желаемого результата... что мне нужно сделать, чтобы получить более правильный результат?

я бы предложил перейти на MySQL 8 (если возможно) из-за JSON_TABLE(), что делает это намного проще. Это должно быть возможно и в более старой версии, но вам нужно проявить творческий подход с генератором чисел SQL для динамического анализа JSON-массив.

Raymond Nijland 14.05.2019 11:58

пример (отпишитесь от меня) генератора чисел SQL для анализа массива JSON, о котором я говорил. Я считаю, что мой пример может быть помечен как дубликат для этого вопроса, потому что он также использует массив JSON.

Raymond Nijland 14.05.2019 12:02

Спасибо, что указали мне на MySQL8, но есть ли у вас пример сайта, как это делается в этой новой версии, прежде чем я обновлюсь... и есть ли какие-либо улучшения производительности в MySQL8?

John 14.05.2019 12:07
«Спасибо, что указали мне на MySQL8, но есть ли у вас пример сайта, как это делается в этой новой версии, прежде чем я обновлю» видите мой второй комментарий? у него есть пример для MySQL 8.0 и более старых версий MySQL. "и есть ли улучшения производительности в MySQL8?" Почти уверен в этом, поскольку в MySQL 8.0 оптимизатор намного лучше, чем в MySQL 5.
Raymond Nijland 14.05.2019 12:09
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
4
20
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использовать этот:

ORDER BY LOCATE(CONCAT('"', id, '"'), sort)

значения содержат двойные кавычки, поэтому конкатенация должна заключать их в двойные кавычки, а не в одинарные кавычки.
См. упрощенный демо.

Спасибо ... это работает как шарм ... я трачу несколько часов, чтобы получить этот вывод, но я никогда не доберусь до этого простого заказа ... еще раз спасибо ... вы сэкономили мне время :)

John 14.05.2019 12:30

Другие вопросы по теме