[pgsql-jp: 26024] Re: GROUP BY などについて

Kenji Ono ono @ fjct.fujitsu.com
2002年 5月 19日 (日) 02:16:54 JST


小野といいます。


> 早速質問ですが、下のようなテーブルを作成しまして、簡易アンケートの
> システムを作っています。1つの質問に対し、複数の選択肢が用意され、
> ユーザーはその選択肢のなかから1つ選択するというしくみです。
>
> qnは1つの質問についてのデータが入ります。
> qn_itemは1つの選択肢についてのデータが入ります。
> qn_voteは1つの回答についてのデータが入ります。

テーブル関連図が今一見えないのでつらいです。
例えば、
・qn(質問).id(質問コード)とqn_item(選択肢).id(質問コード)で一致。
・qn_item.qn(選択肢コード)とqn_vote(質問毎解答).とのつながりが不明
・質問毎の解答がqn_voteに入っているのなら、qn.idとqn_vote.と一致する
 列が必要。
ようは、テーブルの正規化がなされていないと思われます。
そんなことはないでしょうか。
質問毎に値を管理するなら、qn,qn_voteの関係が不明。
選択肢毎に値を管理するなら、qn_item,qn_voteの関係が不明
選択肢の数に関係なく解答が一つなら、qn,qn_voteを分ける必要を感じません。

取り合えず、qn_voteにid列を追加して質問毎の解答をqn_voteに格納するので
あれば、以下のようなSQLでしょうか。
select qn.id,count(*) from qn,qn_vote
  where qn.id(+) = qn_vote.id
  group by qn.id ;
解答が無い質問(qn.id)にはnullが入ります。
+でqn.idとqn_vote.idの検索結果に関係なくqn.id内容を抽出。
−でqn.idとqn_vote.idの検索結果で一致したqn.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 メーリングリストの案内