[英]laravel 5.3 - order results via whereIn mysql
我在這里查看了其他大多數解決方案,但似乎沒有一個對我有用。 我有一張約有10萬行的表格。
每行是來自物聯網設備的記錄,其中包括該設備的唯一ID。 設備ID可能從100K開始有10K行。
Reading::whereIn('device_id', $ids)->orderBy('created_at',
'DESC')->groupBy('device_id')->get()->
我能夠拉出我需要的ID,並通過“ device_id”將它們分組在一起,作為上面的查詢,但是它為每個ID選擇第一個結果而不是最后一個。
如何獲得每個ID的最新記錄而不是最舊的記錄?
我看過laravel集合和reverse(),first(),latest(); 選項,但我仍然無法做到
有任何想法嗎?
更新
我能提出的最好的方法是下面的查詢,它確實獲取每個device_id的最新記錄
SELECT t1.* FROM readings t1 WHERE t1.id = (SELECT t2.id FROM readings
t2 WHERE t2.device_id = t1.device_id ORDER BY t2.id DESC LIMIT 1)
然后,我將遍歷這些結果,並僅獲取用戶有權訪問的記錄。
不漂亮,但目前可以使用。
如果有人曾經雄辯過,請回答
我相信這應該工作嗎?
Reading::select('device_id', 'id', DB::raw('MAX(created_at) AS latest'))->whereIn('device_id', $ids)->orderBy('latest', 'DESC')->groupBy('device_id')->get();
希望這可以幫助!
好的,我相信這可能會奏效,因為以前的嘗試沒有:
$sub = Reading::orderBy('created_at','desc');
return DB::table(DB::raw("({$sub->toSql()}) as sub"))
->whereIn('device_id', $ids)
->groupBy('device_id')
->get();
您基本上運行了一個“子查詢”。 因此,按照您需要的順序檢索結果,然后運行第二個查詢將它們分組。
這是一個棘手的問題。 一旦用數據庫術語重新構造了問題,例如“獲取MySQL查詢中每個ID的最大記錄”之類的東西,就很容易找到很多SO答案。
這是關於SO的高度評價的示例: 檢索每個組中的最后一條記錄
在更新的查詢中,實際上對我認為的每一行都重新計算了子查詢。 我們可以通過將讀數與自身結合來做得更好(請查看以上鏈接作為參考)
SELECT r1.*
FROM readings r1
LEFT JOIN readings r2
ON r2.device_id = r1.device_id
AND r1.date_created < r2.date_created
WHERE r2.device_id IS NULL # there is no row with a date_created greater than r1's
;
device_id和date_created上的索引是簡化此操作的第一步
我終於能夠整理好它。 以下查詢返回的正是我想要的laravel。
$sql = Reading::select('created_at', 'column1', 'column2', 'column3', 'column4', 'column5',
'column6')->whereIn('device_id', ['0','0'])->toSql();
// 0 is just "empty" value, it doesn't matter here yet
$db = DB::connection()->getPdo();
$query = $db->prepare($sql);
// real ids im looking for
$query->execute(array('ffvr5g6h', 'ccvl5f4rty'));
$collection = collect($query);
// change this to take ever (n) record
//$collection = $collection->every(100);
$collection = $collection->groupBy('device_id');
foreach ($collection as $collect) {
// process data
$end = $collect->last();
print_r($end);
}
上面的查詢是在大約半秒內查詢10萬行,然后將其轉換為laravel的集合,一次放入一個由id分組的集合中,然后從該結果中獲取最后一條記錄。
感謝所有嘗試提供幫助的人:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.