クロス集計(複数のカウントを取る)

クロス集計とか言っておきながらCOUNT()は使わない。

  • place::場所テーブル
    • id
    • lat::緯度
    • lng::経度
    • name::名称
  • comment::コメントテーブル
    • id::
    • id__place::関連するplaceテーブルのID
    • body::コメント本文
    • wannago_or_beenthere::w(行きたい) | b(行ったことがある)

placeテーブルから1レコード取得しつつ、『行きたいコメント』と『行ったことあるコメント』の数も取得する

SELECT
place.*,
SUM(CASE WHEN 'w' = comment.wannago_or_beenthere THEN 1 ELSE 0 END) AS _cnt_w_,
SUM(CASE WHEN 'b' = comment.wannago_or_beenthere THEN 1 ELSE 0 END) AS _cnt_b_
FROM  place, comment
WHERE place.id = ?
AND   place.id = comment.place
  • 注意点

_cnt_w_と_cnt_b_はマッチがなかった場合、0ではなくnullなので注意。
またその場合、結果セットの_cnt_w_・_cnt_b_フィールドを見ても!isset()となっている。なんでだろ。
あと該当レコードがなかった場合も、配列長1なので気をつけること。