MySQL ORDER по одному определенному значению в столбце (с разделенными запятыми значениями) - PullRequest
0 голосов
/ 28 мая 2019

Я хочу отсортировать запись пользователя по городу (выбирается из выпадающего списка).например, если я передам 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,

Ответы [ 2 ]

2 голосов
/ 28 мая 2019

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

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

Сначала ставятся совпадения.

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

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

Выражение:

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    |
...