Я хочу отсортировать запись пользователя по городу (выбранному из раскрывающегося списка). например, если я передам 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,
Ты можешь сделать:
ORDER BY (FIND_IN_SET('22', city_ids) > 0) DESC
Это ставит спички на первое место.
Затем вы должны исправить свою модель данных. Оно сломано, сломано, сломано. Хранить списки идентификаторов в строке неправильно по многим причинам:
@амитгупта . . . Вы бы использовали таблицу соединений/ассоциаций с одной строкой на пользователя и city_id
.
Выражение:
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 |
Итак, как добиться этого без сохранения нескольких значений в столбце, есть ли лучшее решение mysql для моей проблемы.