Laravel - случайным образом выбрать n строк, содержащих одно и то же значение в определенном столбце, после применения 'order by' - PullRequest
0 голосов
/ 28 января 2020

В моем проекте Laravel, в таблице базы данных ads, у меня есть следующая структура:

id | col1 | col2

col2 имеет значения типа topad, bump, urgent вместе с пустое значение Я хочу взять все строки из таблицы ads и отсортировать их в алфавитном порядке по col2 в порядке убывания.

Итак, я использовал:

Ads::orderBy('col2','DESC')->get()

Теперь у меня есть 2 условия для применения к запросу.

1-е условие: Предположим, есть 4 строки с topad в col2, 5 строк с urgent в col2, 6 строк с bump в col2 и 7 строк с пустым значением в col2. Таким образом, строки с urgent в col2 появятся на 1-м месте, с topad на col2 появятся на 2-м, а bump на col2 появятся на 3-м и с пустыми значениями на col2 появятся на 4-м. Теперь мне нужно рандомизировать порядок строк в каждом наборе. Например, строки с topad в col2 могут иметь ids 1,2,3,4. Я хочу рандомизировать эти строки (что может привести, например, к 4,2,1,3). Но они появятся перед строками, содержащими topad в col2. То же самое верно для topad и bump наборов строк и строк, содержащих любое пустое значение в col2.

Таким образом, запрос становится:

Ads::orderBy('col2','DESC')->inRandomOrder()->get(); 

2-е условие: Предположим, строки упорядочены по col2 значениям. Но из каждого набора строк, содержащих одинаковое значение в col2, мне нужно n количество строк из тех, которые имеют непустое значение в col2, то есть случайно Мне нужно n строк из urgent ed строк, n из topad ed строк, n из bump ed строк и все из empty ed строк.

Как тогда написать запрос?

1 Ответ

1 голос
/ 29 января 2020

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

$top_ads = Ads::whereCol2('topad')->inRandomOrder()->limit(5)->get();
$urgent_ads = Ads::whereCol2('urgent')->inRandomOrder()->limit(10)->get();
$bump_ads = Ads::whereCol2('bump')->inRandomOrder()->limit(2)->get();

Это создаст ваши запросы, и после этого вы сможете делать с их коллекциями все, что захотите. Объедините их, измените их порядок и т. Д. c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...