Laravel-произвольно выбрать n строк, содержащих одно и то же значение в определенном столбце после применения 'order by'

Laravel-произвольно выбрать n строк, содержащих одно и то же значение в определенном столбце после применения 'order by'

28.01.2020 11:42:34 Просмотров 2 Источник

В моем проекте 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 могут иметь значение topad4 1,2,3,4. Я хочу рандомизировать эти строки (Что может привести, например, к 4,2,1,3). Но они будут появляться перед строками, содержащими topad в col2. То же самое верно для наборов строк topad и bump и строк, содержащих любое пустое значение в col2.

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

bump0

2-е условие: предположим, что строки упорядочены по значениям col2. Но из каждого набора строк, содержащих одно и то же значение в col2, мне нужно bump3 количество строк из тех, которые имеют непустые значения в col2, т. е. случайным образом мне нужно bump3 строки из urgented строк, bump3 из topaded строк, bump3 из bumped строк и все из urgent1ed строк.

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

У вопроса есть решение - Посмотреть?

Ответы - Laravel-произвольно выбрать n строк, содержащих одно и то же значение в определенном столбце после применения 'order by' / Laravel - randomly select n number of rows containing same value in certain column after applying 'order by'

vanderbake

29.01.2020 12:17:38

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

$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();

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

Закрыть X