ただSQLite側でうまくいっても、CGIとして(今のところはApacheのモジュールとして動かしてるけど)動作させると動かないSQLがあり、かなりはまりました。今回、データベースを設計しなおしていて、「あれ、動かないなぁ。プロトでは動いたのになぁ」というのが多々あり。このWikiを作る前にとりあえず作ってみたプロトタイプと見比べてみたら、CREATE VIEW 文の GROUP BY 句の違いのせいでした。
データを取得できなかったSQL
CREATE VIEW V_SUM_MEDIA AS
SELECT S.MEDIA AS ID, M.NAME AS NAME, COUNT(S.ID) AS TOTAL
FROM D_SITE S, M_MEDIA M
WHERE S.MEDIA = M.ID
GROUP BY ID;
データを取得できた、プロトタイプのSQL
CREATE VIEW V_SUM_MEDIA AS
SELECT S.MEDIA AS ID, M.NAME AS NAME, COUNT(S.ID) AS TOTAL
FROM D_SITE S, M_MEDIA M
WHERE S.MEDIA = M.ID
GROUP BY S.MEDIA;
違いは最後の GROUP BY 句だけ。
でもさー、なんで? 同じような指定をしていた他のビューは動いてるし、コマンドラインからsqlite3.exeで動作させると、最初のヤツでも普通に動くんだよね。Firefoxのアドオン「SQLite Manager」でも。
まあ、SQLの仕様として正しいか否かというのは知らないので、そのせいかもしれないけど――釈然としない……。前者だとPHPのPDO::Query()では結果がFalseになるだけで、いったい何がいけないのかわからないから、原因を突きとめるのに何時間もかかってしまったし。