Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

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の場合は上記のような書き方が吉です。