Order By не поможет?

Изображение the_voodoo

Цель такая...
Есть таблица с странами..

id name
1 RUS
2 JPN
3. MEX
4. USA
5. KZ
6. UKR

Мне надо вывести все эти страны с условием: 1) сначало идет USA, 2) Потом RUS 3) А потом все оставльное..

ПС. предлагать еще одно поле для сортировки не прокатывает. надо сделать в одном SQL запросе.

с UNION чтото не прокатывает(
"SELECT * FROM country WHERE id = {ID_EUROPE}
UNION
SELECT * FROM country WHERE id = {ID_USA}
UNION
SELECT * FROM country WHERE id = {ID_RUSSIA}
UNION
SELECT * FROM country WHERE id NOT IN ({ID_EUROPE}, {ID_USA}, {ID_RUSSIA}) ORDER BY `name` ASC;"
это пример!
SQL прокатывает, но результата нужного нету(

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

И понятно почему

Дело в том, что ORDER BY выполняется после того как UNION построит одну таблицу из всех подзапросов SELECT. Т.е. сперва делаются все SELECT'ы, затем они склеиваются в одну псевдотаблицу, а затем уже к этой таблице применяется ORDER BY.

Не знаю, может я спросонья, но очевидного красивого решения вашей задачи я не вижу. Проще самому приложению выполнить два SELECT'а вместо одного и вывести друг за другом, чем заморачиваться какими-то невероятными конструкциями. А самым простым способом было бы занесение name в таблицу уже по условиям нужной сортировки и тогда уже делать ORDER BY по id, т.е.

id name
100 USA
200 RUS
300 JPN
400 KZ
500 MEX
600 UKR

оставляя номера между скажем 200 и 300 для стран, которые могут быть вставлены между 200 и 300 по результатам сортировки имени. Но я понимаю, что конечно такое не всегда возможно по логике работы приложения.

как вариант SELECT ID, NAME

как вариант

SELECT ID, NAME FROM
(
SELECT 1 ORD, ID, NAME FROM country WHERE id = 6
UNION
SELECT 2 ORD, ID, NAME FROM country WHERE id = 4
UNION
SELECT 3 ORD, ID, NAME FROM country WHERE id = 1
UNION
SELECT 4 ORD, ID, NAME FROM country WHERE id NOT IN (6,4,1) 
ORDER BY ORD,  name ASC) S

в итоге просто сделал два

Изображение the_voodoo

в итоге просто сделал два селекта и не парился. спасибо!

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023