簡體   English   中英

laravel 5.3-通過whereIn mysql命令結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM