Запрос в mySQL для выбора 44 вопросов из каждой «цели» 11 в случайном порядке PHP / Laravel - PullRequest
0 голосов
/ 07 октября 2018

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

Примерно так: выберите * ограничено 44 из «вопросов», где 11 из каждого«цель» в случайном порядке.Таблица выглядит примерно так:

enter image description here

На данный момент я сделал следующее:

$questions = Question::take(44)->inRandomOrder()->get();

Но это толькополучить 44 вопроса, где одни категории больше других.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018
$questions = collect();
$questions = $questions->merge(Question::where('purpose', 'purpose-1')->take(11)->inRandomOrder()->get());
$questions = $questions->merge(Question::where('purpose', 'purpose-2')->take(11)->inRandomOrder()->get());
$questions = $questions->merge(Question::where('purpose', 'purpose-3')->take(11)->inRandomOrder()->get());
$questions = $questions->merge(Question::where('purpose', 'purpose-4')->take(11)->inRandomOrder()->get());
$questions = $questions->shuffle();
0 голосов
/ 07 октября 2018

На ум приходят три пути:

1 - объединение четырех разных таблиц.для этого я предлагаю вам сначала получить все цели по отдельности и перемешать их, вы также можете использовать запрос RANDOm, но это очень медленная команда запроса.

$fourPurposes =Question::select('purpose')->get()->shuffle()->flatten()->unique();

$unions = Question::query();
for(%i=0;$i<4;$i++){
  $query = Question::where('prupose', $fourPurposes[$i])->limit(11);
  $unions = $unions->union($query);
}
$questions = $unions->get();

2 - это сложно, но если выу меня есть очень большие таблицы и индексированные столбцы назначения, я думаю, что это будет лучше.В этом методе вы объединяете таблицу вопросов с другой таблицей вопросов.В одном вы ограничиваете цель, в другом вы ограничиваете количество вопросов.Запрос должен быть примерно таким.(Я действительно не уверен в этом, я надеюсь, что мы можем отредактировать это, чтобы сделать его лучше)

$table1 = DB::table('questions')->groupBy('purpose')->limit(4);
$questions = DB::table('questions as q1)
->join(Db::raw('
  (select * from questions as q2 limit 11)
'), function($join){ 
      $join->on('q1.purpose','=','q2.purpose');
   })->limit(44)->get();

3- Я думаю, что этот метод вообще лучший.Если у вас нет массивного стола, используйте этот.Это намного проще и проще.В этом методе у вас просто есть четыре разных запроса.Это очень похоже на первый метод, но проще.

$fourPurposes =Question::select('purpose')->get()->shuffle()->flatten()->unique();

$questions =  new Collection();

for(%i=0;$i<4;$i++){
  $query = Question::where('prupose', $fourPurposes[$i])->limit(11)->get();
  $questions = $questions->union($query);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...