MySQL ORDER По одному определенному значению в столбце (со значениями, разделенными запятыми)

Я хочу отсортировать запись пользователя по городу (выбранному из раскрывающегося списка). например, если я передам city_id 22 в своем запросе, то сначала я хочу, чтобы все строки имели city_ids 22, а затем остальные строки.

Я знаю, что WHERE find_in_set('22',city_ids) даст мне правильный результат, но он не вернет все строки, поэтому я хочу добиться этого, используя некоторые ORDER BY .

Я пробовал ORDER BY FIND_IN_SET('22',city_ids), но это не работает. Как мне это исправить, любым лучшим способом?

Пользовательская таблица:

Id    Name     city_ids
1     AAAAA    10,22,30
2     BBBBB    11,28
3     CCCCC    15,22,44
4     DDDDD    19,99,
5     EEEEE    55,27,22

Хотите отсортированный вывод, как показано ниже:

Id    Name     city_ids
1     AAAAA    10,22,30
3     CCCCC    15,22,44
5     EEEEE    55,27,22
2     BBBBB    11,28
4     DDDDD    19,99,
Освоение архитектуры микросервисов с 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
0
429
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ты можешь сделать:

ORDER BY (FIND_IN_SET('22', city_ids) > 0) DESC

Это ставит спички на первое место.

Затем вы должны исправить свою модель данных. Оно сломано, сломано, сломано. Хранить списки идентификаторов в строке неправильно по многим причинам:

  • Типы данных (предположительно) неверны. Идентификаторы являются числами и не должны храниться в виде строк.
  • Хранение нескольких значений в столбце — это не способ хранения вещей в SQL.
  • Идентификаторы должны иметь правильно объявленные отношения внешнего ключа, которые вы не можете объявлять.
  • В SQL нет очень хороших функций для обработки строк.
  • Результирующие запросы не могут использовать преимущества индексов или секционирования, что снижает производительность.
  • В SQL есть отличная структура данных для хранения списков вещей. Он называется стол, а не строковым столбцом.

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

amit gupta 28.05.2019 16:20

@амитгупта . . . Вы бы использовали таблицу соединений/ассоциаций с одной строкой на пользователя и city_id.

Gordon Linoff 28.05.2019 16:55
Ответ принят как подходящий

Выражение:

FIND_IN_SET('22', city_ids) > 0

вернет 1 для всех строк, где '22' существует в столбце city_ids и 0 для остальных.
Итак, после этого нужно добавить еще один уровень для сортировки по возрастанию id:

ORDER BY 
  FIND_IN_SET('22', city_ids) > 0 DESC, 
  id 

Смотрите демо.
Результаты:

| Id  | Name  | city_ids |
| --- | ----- | -------- |
| 1   | AAAAA | 10,22,30 |
| 3   | CCCCC | 15,22,44 |
| 5   | EEEEE | 55,27,22 |
| 2   | BBBBB | 11,28    |
| 4   | DDDDD | 19,99    |

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