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