Выборка в mySQL по нескольким параметрам

92
24 ноября 2020, 12:30

Голову сломал, поэтому, прошу помощи.
Суть вопроса: есть таблица table, в которой хранятся объявления. Вот такая структура:

id | author_id | rubric_id | published | остальное не важно

Например, мне нужно вывести массив из 10 объявлений, в таком порядке:
1) Сначала объявления с author_id=XXX, если они есть
2) Если их нет, или их набралось менее, чем 10, то дополнить массив объявлениями с rubric_id=YYY
3) Если массив до сих пор не наполнился 10-ю элементами, то добавить в него ещё несколько рандомных объявлений
4) И всё это отсортировать по дате published

Как правильно составить mySQL-запрос?

Уф))) Спасибо!!!

Answer 1
select *
  from (
    select id, author_id, rubric_id, published
      from table
     order by author_id=XXX desc, rubric_id=YYY desc
     limit 10
   ) X
  order by published

Таков синтаксис для MySQL, так как в нем условие author_id=XXX возвращает 0 в случае если автор не равен XXX и 1 если равен. Таким образом при обратной сортировке в начале получаем всех авторов XXX, после них идут остальные авторы. Для совпавших значений первой колонки идет сортировка по второй, а следовательно для не совпавших авторов первыми получаем нужную рубрику.

P.S. для других СУБД сравнение может не давать числовые 0 и 1 и там потребуется писать более сложные конструкции вроде order by case author_id when XXX then 1 else 0 end desc, ...

Answer 2
select * from (
select * from table where author_id=XXX
union 
select * from table where rubric_id=YYY
union
select * from table where author_id <> XXX and rubric_id <> YYY) 
order by published 
limit 10
READ ALSO
вывести pdf фалй полученный по curl

вывести pdf фалй полученный по curl

как вывести на страницу pdf файл полученный по curl через обращение на api ? если вывести print_r result То ничего нет , как убедится что файл получен ?

111
LiveChatMessages API YouTube возвращает null

LiveChatMessages API YouTube возвращает null

Пытаюсь получить сообщения с чата прямой трансляции с помощью GET-запроса

100
Laravel api. Как сделать необязательный роут

Laravel api. Как сделать необязательный роут

Подскажите, как в Laravel сделать route как тут: https://jsonplaceholdertypicode

96
Рандомный выбор между словами

Рандомный выбор между словами

Допустим у меня есть две переменные

117