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

SQLAlchemyでクロス集計

こんな感じでできます。

import sqlalchemy from case, func

rs = session.query(User,case[
  func.sum(case([(User.blood_type == 'A',1)],else_=0)).label("A"),
  func.sum(case([(User.blood_type == 'B',1)],else_=0)).label("B"),
  func.sum(case([(User.blood_type == 'O',1)],else_=0)).label("O"),
  func.sum(case([(User.blood_type == 'AB',1)],else_=0)).label("AB")
]).group_by(User.blood_type).all()

これはいいものだ。SQLAlchemy最高。

ContainerViewでのViewController切り替え

よくありますよね。SegmentedControlでスイッチを切り替えるタイミングで、ContainerViewのViewControllerを切り替えたいみたいな。あるある。

先駆者の方々を探してみた所、下記のエントリが最も簡単に実行できた。ソースコピペして動きます。

spin.atomicobject.com

子供のViewControllerをその都度切り替えて、そいつのviewをContainerViewにaddSubviewするという考え方。切り替えたいViewControllerの数だけConatinerViewを追加するというロックなやり方もあってそれはねーだろって思った次第。下記リンクがそのやり方.. deprecatedですよこれは。

coding discovery: Swap ViewControllers with a Segmented Control in iOS

EurekaでカスタムのViewControllerをPUSHしたい

Eurekaには「presentationMode」というプロパティがあって、これを実装しているRowに限りPushしたい対象のVCをカスタマイズできる。論よりコード。


Push CustomViewControler on Eureka Row

これが一番簡単。

mysql5.7で「is not in GROUP BY clause and contains nonaggregated column 」

SELECT list is not in GROUP BY clause and contains nonaggregated column '' which is not functionally dependent on columns in GROUP BY clause

上記のようなエラーが出た。

なんだろうと思ってたら、何の事はない。GroupByで集約してSELECTで指定されているカラムが集約されていませんよ、ということ。注文テーブルを商品でGroupByしたら、注文IDがSELECT句にあっても困りますよね、だってそのIDって集約された結果じゃなくて適当な値が入っている(= not functionally dependent)からダメですよ、というものらしい。

ORマッパーとか使ってると、勝手にこの辺のカラムがSELECTに入ることがあるかもな〜 その時はカラム指定して逃げるか、only_full_group_byオプションを有効にするしか無いみたいね。