[pgsql-jp: 26022] GROUP BY などについて
Kasumi Iwata
Kasumi_Iwata @ virtems.com
2002年 5月 19日 (日) 00:04:53 JST
はじめまして岩田と申します。
早速質問ですが、下のようなテーブルを作成しまして、簡易アンケートの
システムを作っています。1つの質問に対し、複数の選択肢が用意され、
ユーザーはその選択肢のなかから1つ選択するというしくみです。
qnは1つの質問についてのデータが入ります。
qn_itemは1つの選択肢についてのデータが入ります。
qn_voteは1つの回答についてのデータが入ります。
アンケートの結果をグラフで表示するために、選択肢のリストと、それ
に投票している人数の合計数を取り出すためのクエリーで困っています。
qn_itemテーブルからcontentを取り出し、qn_voteテーブルから同じ質問
(qn_vote.qn)で、同じ項目(qn_vote.item)が選択されているものを数えた
いのです。
<一番まともだったクエリー>
SELECT qn_item.id,count(*)
FROM qn_item,qn_vote
WHERE qn_item.qn=%d
AND qn_vote.qn=%d
AND qn_item.id=qn_vote.item
GROUP BY qn_item.id;
とするのですが、投票者がいない項目、つまりcount(*)が0のところは、
出力されなくて困っています。どのようなSQL文にするのが最適かアドバ
イスお願いします。
クエリーを2つに分けるという手はあるのですが、なんとか1つで効率的
にできないものかと思っています。
ちなみにqn_item.contentを取り出したいのにidを取り出しているのは、
contentのデータ型はTEXTで日本語のためか上手く動作しません。これは
localeの問題だと思うのですが、クエリーが違うかも知れないので先に報
告しておきます。localeの問題ならば、qn_item.idで取得の方法をお願い
します。
-----------------作成したテーブル------------------
CREATE TABLE qn (
id SERIAL PRIMARY KEY,
title TEXT,
description TEXT,
uid TEXT,
active BOOLEAN,
visible BOOLEAN
);
CREATE TABLE qn_item (
qn INTEGER REFERENCES qn ON DELETE CASCADE,
id INTEGER,
content TEXT,
PRIMARY KEY(qn,id)
);
CREATE TABLE qn_vote (
qn INTEGER REFERENCES qn ON DELETE CASCADE,
uid TEXT,
item INTEGER,
vote_time TIMESTAMP,
PRIMARY KEY(qn,uid)
);
岩田香純 Kasumi Iwata
Kasumi_Iwata @ virtems.com
VIRTEMS Corp.
http://www.virtems.com
------------------------------------------
ロロノア・プロジェクト(新製品開発)はじめました。
------------------------------------------
FrameScript日本語対応版の販売を開始しました。
http://www.infodesign.co.jp/framescript/
pgsql-jp メーリングリストの案内