久しぶりにSQLを。

たまたま作成した某簡易アンケートシステム。
アンケートのデータの保存を、次のようにした。

CREATE TABLE IF NOT EXISTS `unq_data` (
  `unq_data_id` int(11) NOT NULL auto_increment,
  `sex` tinyint(1) NOT NULL default '0',
  `age` tinyint(1) NOT NULL default '0',
  `question1` tinyint(1) NOT NULL default '0',
  `question2` tinyint(1) NOT NULL default '0',
  `question3` tinyint(1) NOT NULL default '0',
  `question4` tinyint(1) NOT NULL default '0',
  `created_at` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `user_ip` varchar(16) NOT NULL default '0',
  PRIMARY KEY  (`unq_data_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

一人の回答を1レコードで保存するというものです。
まあ、設問を増やしたりとかそういうのでは対応できない形ですね。
で、この場合の集計画面の作成。
sexは3パターン。
ageは6パターン。
question1は2パターン
question2は6パターン
question3は5パターン
question4は10パターン。ある。
これを、集計するには。。。。。。。

安易に考えると、上記の31パターンのものを動かしてたせばいい。しかし!そんなことはできないので。

$sql = "SELECT "
                . "SUM(CASE WHEN sex = 1 THEN 1 ELSE 0 END) as m, "
                . "SUM(CASE WHEN sex = 2 THEN 1 ELSE 0 END) as w, "
                . "SUM(CASE WHEN sex = 0 THEN 1 ELSE 0 END) as n, "
                . "SUM(CASE WHEN age = 1 THEN 1 ELSE 0 END) as age1, "
                . "SUM(CASE WHEN age = 2 THEN 1 ELSE 0 END) as age2, "
                . "SUM(CASE WHEN age = 3 THEN 1 ELSE 0 END) as age3, "
                . "SUM(CASE WHEN age = 4 THEN 1 ELSE 0 END) as age4, "
                . "SUM(CASE WHEN age = 5 THEN 1 ELSE 0 END) as age5, "
                . "SUM(CASE WHEN age = 6 THEN 1 ELSE 0 END) as age6, "
                . "SUM(CASE WHEN question1 = 1 THEN 1 ELSE 0 END) as q1_1, "
                . "SUM(CASE WHEN question1 = 0 THEN 1 ELSE 0 END) as q1_2, "
                . "SUM(CASE WHEN question2 = 0 THEN 1 ELSE 0 END) as q2_0, "
                . "SUM(CASE WHEN question2 = 1 THEN 1 ELSE 0 END) as q2_1, "
                . "SUM(CASE WHEN question2 = 2 THEN 1 ELSE 0 END) as q2_2, "
                . "SUM(CASE WHEN question2 = 3 THEN 1 ELSE 0 END) as q2_3, "
                . "SUM(CASE WHEN question2 = 4 THEN 1 ELSE 0 END) as q2_4, "
                . "SUM(CASE WHEN question2 = 5 THEN 1 ELSE 0 END) as q2_5, "
                . "SUM(CASE WHEN question3 = 0 THEN 1 ELSE 0 END) as q3_0, "
                . "SUM(CASE WHEN question3 = 1 THEN 1 ELSE 0 END) as q3_1, "
                . "SUM(CASE WHEN question3 = 2 THEN 1 ELSE 0 END) as q3_2, "
                . "SUM(CASE WHEN question3 = 3 THEN 1 ELSE 0 END) as q3_3, "
                . "SUM(CASE WHEN question3 = 4 THEN 1 ELSE 0 END) as q3_4, "
                . "SUM(CASE WHEN question4 = 0 THEN 1 ELSE 0 END) as q4_0, "
                . "SUM(CASE WHEN question4 = 1 THEN 1 ELSE 0 END) as q4_1, "
                . "SUM(CASE WHEN question4 = 2 THEN 1 ELSE 0 END) as q4_2, "
                . "SUM(CASE WHEN question4 = 3 THEN 1 ELSE 0 END) as q4_3, "
                . "SUM(CASE WHEN question4 = 4 THEN 1 ELSE 0 END) as q4_4, "
                . "SUM(CASE WHEN question4 = 5 THEN 1 ELSE 0 END) as q4_5, "
                . "SUM(CASE WHEN question4 = 6 THEN 1 ELSE 0 END) as q4_6, "
                . "SUM(CASE WHEN question4 = 7 THEN 1 ELSE 0 END) as q4_7, "
                . "SUM(CASE WHEN question4 = 8 THEN 1 ELSE 0 END) as q4_8, "
                . "SUM(CASE WHEN question4 = 9 THEN 1 ELSE 0 END) as q4_9 "
             . "FROM "
                . "unq_data ";
        $query = $this->db->query($sql);

これで一件落着。
ベンチとったら、0.001秒だった。