[英]Laravel select random rows from table based on another field
有一個包含20000條記錄的words
表:
ID name rank
1 word1 3
2 word2 5019
3 word3 12334
4 word4 23
5 word5 544
我要從此表中隨機選擇400個單詞,但要滿足以下條件:
第一20個字:選擇隨機地從20個字words
1和1000之間具有秩
第二20個字:選擇隨機地從20個字words
1000和2000之間具有秩
等等...
我必須在20個單獨的查詢中執行此操作嗎? 怎么樣? 有沒有更好的辦法?
我正在使用laravel 5.4和Mysql,也歡迎使用原始查詢建議。 謝謝
使用where子句過濾其排名,然后使用inRandomOrder()和take(20)獲得20個隨機的。
Word::inRandomOrder()->where('rank', '>=', 1)->where('rank', '<=', 1000)->take(20);
為了使它們全部集中在一個查詢中,您可以嘗試一些時髦的邏輯,如下所示:
首先:定義一個返回相同表的視圖,但沒有排名,而是具有類別,因此1 <= rank <1000,....的類別1只是為了使下一步更容易
現在我們可以使用partition by(請參閱嘗試了解over()和partition by )。 請記住按分區內的RAND()進行排序。 按行號對所有結果進行排序。
現在,我們得到的結果如下所示:
rownumber name category
1 word1 1
1 word2 2
1 word3 3
1 word4 4
...
2 word21 1
2 word22 2
2 word23 3
2 word24 4
...
20 word381 1
20 word382 2
20 word383 3
20 word384 4
...
通過選取這些元組中的400個,我們將在20個類別的每一個中擁有20個隨機樣本。
注意-通過RAND()進行訂購可能會很慢,如此處所述:http: //www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get -random-行-從表/
編輯 :結果分區僅用於sql server。 但是你可以在mysql中做類似的事情
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.