Union, order by и rand () в mysql

Я хочу объединить два запроса, НО порядок rand () второго не работает ..

(select * from survey 
where is_priority = 1)
union all (
  select * from (
    select * from survey 
    order by rand() 
    ) as t );

Результат выглядит так:

enter image description here

Объясните, что вы пытаетесь сделать.

Gordon Linoff 11.04.2018 14:14

Строки в подзапросе считаются неупорядоченными, поэтому ORDER BY во втором подзапросе не нужен. Строки результатов запроса без предложения ORDER BY в конце также считаются неупорядоченными. Таким образом, в вашем запросе нет ничего, что могло бы предложить, как должны быть упорядочены строки результатов. Тогда как select * from survey ... может привести только к одному столбцу id_survey, если в таблице явно есть по крайней мере еще один столбец (is_priority)? И, пожалуйста, не вставляйте изображения, а вместо этого копируйте и вставляйте результат в виде текста.

Thorsten Kettner 11.04.2018 18:05
0
2
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я предполагаю, что сначала вы хотите, чтобы is_priority = 1, а затем остальные в случайном порядке.

В таком случае не следует делать этого с union all. Просто добавьте нужные ключи в order by:

select s.*
from survey s
order by (s.is_priority = 1) desc,  -- put priority 1 first in the result set
         rand();

По общему признанию, это помещает строки с наивысшим приоритетом в случайном порядке (среди них). Но вы не указали для них порядок (и это не проблема, если есть только одна строка, в которой условие приоритета истинно).

«Я предполагаю, что вы хотите сначала is_priority = 1, а затем остальные в случайном порядке». Да точно! Но ваш запрос не работает .. Я не понимаю "rand ()" без "order by" и сразу после ","

arthur-28 11.04.2018 15:41

@ arthur-28: Очевидно, это была опечатка. Я отредактировал ответ и заменил WHERE на ORDER BY. Теперь запрос должен работать. В запросе Гордона используются MySQL true = 1, false = 0. Таким образом, при сортировке с помощью (s.is_priority = 1) desc сначала помещаются записи, в которых условие истинно.

Thorsten Kettner 11.04.2018 17:45

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