我有一张桌子说,菜单。其中只有5条记录,但我需要5条以上的记录,包括重复项。

实际情况下,例如,一群人可以订购相同的菜单

1)tea

   ->foo

   ->bar

2)coffee

   ->latte

   ->expresso

3)shake


两个或两个以上的人可以点咖啡。

我试图做到这一点

$menu = RestaurantsMenu::where('tag','=','Coffee')
                                ->get()
                                ->random(5);


菜单
标签
菜单1鸡肉
菜单2
菜单3鸡肉

如您所见,我有两种鸡,如果我想随机取出四只鸡,包括重复,该怎么办?请指教。

最佳答案

该问题在撰写本文时已更新,我对问题的解释可能不正确-暂时将其保留

原始解释:如果数据库中的行少于X,如何通过随机复制其他行来创建带有X条目的结果集。



原始答案:

在查询已拥有的数据之后,应该使用PHP进行这种复制。

我将使用一个接受查询的函数,以及必要的结果数,然后从现有的表中随机创建足够的行。

function fillResultsWithDuplicates($query, $numRowsNeeded) {
  // avoid querying _more_ than needed when you have sufficient
  $res = $query->random($numRowsNeeded);

  // may need to coerce into an array - not familiar with laravel
  return fillArrayWithRandomDuplicates($res, $numRowsNeeded);
}

function fillArrayWithRandomDuplicates($vals, $numEntriesNeeded) {
  /*im sure this can be written to be faster and more succinct
  could accept an optional function to perform the filling*/
  if (count($vals) >= $numEntriesNeeded) return $vals;
  $numDuplicatesNeeded = $numEntriesNeeded - count($vals);
  $dupes = [];

  // Here your are pulling random values from your array to act as duplicates needed
  for ($i = 0; $i < $numDuplicatesNeeded; $i++) {
      $dupes[] = $vals[mt_rand(0, count($vals)-1)]; // array_rand could be used as well but may be slower
  }

  // Maybe shuffle as well if you need
  return array_merge($dupes, $vals);
}


您的情况下的用法

$menu = RestaurantsMenu::where('tag','=','Coffee')->get()
$filledMenu = fillResultsWithDuplicates($menu, 5);


使用简单数组的演示:

$initial = ["a", "b", "c"];
$filled = fillArrayWithRandomDuplicates($initial, 10);
// will contain 7 random selections of a,b,c followed by original a,b,c for total 10 entries
// ex: bcaaabaabc - add shuffles as needed

关于mysql - 当总行数小于n时取出n行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51468076/

10-12 23:03