MySQLでサブクエリが遅い時に使える、派生テーブルでのJOIN
MySQLのサブクエリは(何故か知らんけど)相関クエリ扱いになるので、外側のクエリの件数に対してサブクエリで取得した数のループが走ります。こんなコードだろな、きっと。
for v in outer: for y in inner: #joinできるkeyがあればbreak
しかしながら、特にUPDATEしたい時にはサブクエリが使いたい。僕の例で言うと、注文IDが100の明細の発注ロットを全て3に変えたいという例がありました。サブクエリでやるとこうなります。
update items as i set i.lot = 3 where i.id in ( select item_id from order_details where order_id = 100 )
おせええええええええええ、しねえええええええええええ
デキる子はこうします
JOINを使って、母集合を確定させます。これだと相関性はない。
update items as i inner join ( select item_id from order_details where order_id = 100) as orders on i.id = orders.item_id set i.lot = 3
deleteはこう
delete item from items as item inner join (select item_id from order_details where order_id = 100) as orders on item.id = orders.item_id;
サブクエリだと直感的だから書きやすいけど、MySQLの場合は上記のような書き方が吉です。