簡體   English   中英

將原始SQL'NOT'IN(太慢)轉換為Laravel Eloquent

[英]Convert Raw SQL 'NOT' IN (too slow) to Laravel Eloquent

我在Laravel 5.3控制器中使用Raw SQL運行腳本,但發現它運行緩慢且不安全(如Raw)。 是否有任何方法可以使其更有效並將其轉換為雄辯的或Laravel的Query Builder?

代碼如下,謝謝!

SELECT  machine_code, machine_name
FROM    factory_equipment
WHERE  machine_code  NOT IN
    (
        SELECT  distinct(machine_code)
        FROM    echecklist_data
        WHERE   DATE_FORMAT(date, '%Y-%m-%d') = CURDATE() 
    )
  AND type='production' ORDER BY machine_code ASC

您可以使用SQL提高效率。 我建議NOT EXISTS

SELECT fe.machine_code, fe.machine_name
FROM factory_equipment fe
WHERE NOT EXISTS (SELECT 1
                  FROM echecklist_data ed
                  WHERE ed.machine_code = fe.machine_code AND
                        ed.date >= CURDATE() AND
                        ed.date < CURDATE() + INTERVAL 1 DAY
                 ) AND
     fe.type = 'production'
ORDER BY fe.machine_code ASC;

我會進一步推薦以下索引: factory_equipment(type, machine_code, machine_name)echecklist_data(machine_code, date)

您可以通過使其成為LEFT JOIN並僅選擇echecklist_data表中不匹配的行來加快此查詢的速度:

SELECT    fe.machine_code, fe.machine_name
FROM      factory_equipment fe
LEFT JOIN echecklist_data ed ON ed.machine_code = fe.machine_code AND DATE_FORMAT(ed.date, '%Y-%m-%d') = CURDATE()
WHERE     fe.type='production' AND ed.machine_code IS NULL
ORDER BY  fe.machine_code ASC

請注意,如果您的date列是DATETIME類型,則使用DATE(ed.date) = CURDATE()也將比DATE_FORMAT(ed.date, '%Y-%m-%d') = CURDATE()

我設法使用laravel的查詢使其工作。 希望對別人有幫助

DB::table('factory_equipment')
        ->select('factory_equipment.machine_code', 'factory_equipment.machine_name')
        ->leftjoin('echecklist_data', function ($leftjoin) {
            $leftjoin->on('factory_equipment.machine_code', '=', 'echecklist_data.machine_code')
            ->Where( DB::raw("DATE_FORMAT(echecklist_data.date, '%Y-%m-%d')"), DB::raw("CURDATE()") );
            })
        ->where('factory_equipment.type' , '=', 'production') 
        ->whereNull('echecklist_data.machine_code')         
        ->get();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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