Извлекать из базы данных строки, упорядоченные по логическому столбцу, но также случайные в качестве второго критерия

#sql #postgresql #postgresql-10

#sql #postgresql #postgresql-10

Вопрос:

У меня есть таблица элементов:

 id | name | is_featured
1    name1       false 
 

Элементы из этой таблицы, которые мне нужны, чтобы показать их случайным образом, но is_featured первым. Правила следующие:

  1. Если количество is_featured=True > 6, получить is_featured=True все и рандомизировать и получить первые 6
  2. Если количество is_featured=True < 6, получить is_featured=True все и случайным образом подсчитать, сколько пропущено до 6. Получить из неустановленных случайных оставшихся элементов.Объединение списков.

Я делаю это за 2-3 шага в базе данных:

  • сначала подсчитайте количество отображаемых
  • сначала получить список, затем получить остальные, если это необходимо, и рандомизировать (в бэкэнде)

Это можно сделать за один шаг, в базе данных?

Ответ №1:

Кажется, вам нужно шесть строк с is_featured первой. Вы можете сделать это за один шаг:

 select i.*
from items i
order by i.is_featured desc,  -- true is first
         random()
fetch first 6 rows only;
 

То есть сначала отсортируйте все данные is_featured . Затем выберите первые шесть.