30分ハマった。知らなかった。
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を切り替えたいみたいな。あるある。
先駆者の方々を探してみた所、下記のエントリが最も簡単に実行できた。ソースコピペして動きます。
子供のViewControllerをその都度切り替えて、そいつのviewをContainerViewにaddSubviewするという考え方。切り替えたいViewControllerの数だけConatinerViewを追加するというロックなやり方もあってそれはねーだろって思った次第。下記リンクがそのやり方.. deprecatedですよこれは。
coding discovery: Swap ViewControllers with a Segmented Control in iOS
UICollectionViewの背景が真っ黒になる
デフォルトの背景色が真っ黒らしい... UIColor.clearColor()を呼べば解決です。なんなのほんとw
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 '
上記のようなエラーが出た。
なんだろうと思ってたら、何の事はない。GroupByで集約してSELECTで指定されているカラムが集約されていませんよ、ということ。注文テーブルを商品でGroupByしたら、注文IDがSELECT句にあっても困りますよね、だってそのIDって集約された結果じゃなくて適当な値が入っている(= not functionally dependent)からダメですよ、というものらしい。
ORマッパーとか使ってると、勝手にこの辺のカラムがSELECTに入ることがあるかもな〜 その時はカラム指定して逃げるか、only_full_group_byオプションを有効にするしか無いみたいね。