[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 メーリングリストの案内