2011年08月08日

webアプリ実装におけるトラップ

その1、タブ切替。
http://archiva.jp/web/javascript/tab-menu.html
ここに書かれている通りに作れば問題無く出来ます。
が。
今日の仕事で見たのはその通りに実装されてなかった。
で、正しく動かなかったので原因を調査した結果、上記サイト見付けて直して解決。
上記サイトのmemoに書いてありますが、Scriptのコア部分の実装位置が問題でした。
これがそのままオブジェクトになるので、起動部分より先に実行されていないと「オブジェクトが無いんじゃい」と言われる。
Newしないと使えないクラスをNewしないで使おうとしたようなもの。
あれ作った人は何で逆にしちゃったんだろうか。
逆にしても動くブラウザがあるのが問題って気はするけど。

その2、count関数。
現在Zend Frameworkを使ったアプリを開発してるんですが、2つのテーブルを結合して集計した値を入れる為に以下のようなSQL文を作成。もちろん極限まで簡略化してます。
-------------------------
SELECT
a.name
, COUNT(b.id) as record_count
FROM
a
LEFT JOIN
b
ON
a.id = b.table_a_id
AND
b.id = 1
-------------------------
aの各レコードに対し、b.idに関連するレコードがいくつあるのかを取得する。
bのレコードは無くても表示するので結合はLEFT JOIN。
ちなみにテーブルはaがアンケート項目、bが回答とでも思ってください。
aの項目1にチェックを付けた人は何人、項目2は何人、みたいな。
んで上記形式のSQL文をphpMyAdminで発行して狙い通りの結果が返ってきたので、そのままアプリにも実装したらCOUNTの結果が常に「0」に。
なんですとー。
この時更に罠だったのは、上位6件を並べ替えて取得していた事。
ソートはカウント降順、並べ替え用カラム昇順。
結果として、カウントが0だったから並べ替え用カラムの順番で表示されて、テスト用に仕込んでたデータが表示されなかった。
表示されなかったから0件だった事に気付くのが遅れたというオチ。
まあ結局のところzendではこの方法は使えないので、
-------------------------
IFNULL(
(SELECT
COUNT(id)
FROM
b
WHERE
b.table_a_id = a.id
AND
b.id = 1
)
, 0
) as record_count
-------------------------
というサブクエリを発行して取得する事になります。
まあ考え方的にもこっちのが健全な気はしますね……。
posted by ちはやふづき at 22:52| Comment(0) | TrackBack(0) | 日記
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/47257181
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック