[pgsql-jp: 28503] Re: SQLでの質問
Tamotsu Ebina
ebina @ pluto.dti.ne.jp
2002年 12月 27日 (金) 21:54:50 JST
海老名@インフォテック です
一般的に
a_table b_table c_table
があって
a_table 3件
b_table 5件
c_table 10件
なら
select * from a_table,b_table,c_table;
の結果は直積150件になります。
この結果には何ら論理的な意味はありません。
結果から自分の条件を満たす意味のある行を取り出す
ためにWhereを指定します。
「そんな事知っている」と言われそうですが、
結果が堀江さんの思うように表示されないのは
whereの指定が堀江さんの期待しているものと違うからです。
user_tableが何なのか分からないので正確には答えられませんが
一番怪しそうなのは
where message_table.message_send_id = '$user_id'
or message_table.message_send_id = teigi_group_table.teigi_group_id
and teigi_group_table.teigi_num = group_table.group_id_num
and user_table.user_num = group_table.group_user_num
and user_table.user_id = '$user_id' ;
の or です。
上式は下記の式と同等です
where (message_table.message_send_id = '$user_id'
and teigi_group_table.teigi_num = group_table.group_id_num
and user_table.user_num = group_table.group_user_num
and user_table.user_id = '$user_id' )
or
(message_table.message_send_id = teigi_group_table.teigi_group_id);;
and or の演算の優先順位はC言語等と同じですから
4つのテーブルmessage_table, group_table, user_table, teigi_group_table
の直積中
or の条件を満たすものはすべて選択行に含まれます。
----- Original Message -----
From: "yoshiki(R)HORIE" <yoshiki @ presence-inc.jp>
To: <pgsql-jp @ ml.postgresql.jp>
Sent: Friday, December 27, 2002 6:49 PM
Subject: [pgsql-jp: 28500] SQLでの質問
> こんにちは
> 堀江と申します。
>
> テーブルが下記のようになっております。
> create table message_table (
> message_num serial primary key,
> message_send_id varchar(10),
> message_from_id varchar(10),
> message_subject text,
> message_text text,
> message_date date,
> message_file_name varchar(50),
> message_save_file_name varchar(15),
> message_flg_01 int,
> message_flg_02 int,
> message_flg_03 int,
> message_flg_04 int,
> message_flg_05 int
> )
>
>
> create table group_table (
> group_num serial primary key,
> group_user_num int,
> group_id_num int,
> group_dir_num int
> )
>
>
> create table teigi_group_table (
> teigi_num serial primary key,
> teigi_group_id varchar(10),
> teigi_group_name text,
> teigi_group_dir int
> )
>
> このテーブルでmessage_tableの内容をselectします。
>
> $sql = "select message_table.message_num,
> message_table.message_from_id,
> message_table.message_subject, message_table.message_date,
> message_table.message_file_name, message_table.message_flg_02, message_table.message_flg_04
> from message_table, group_table, user_table, teigi_group_table
> where message_table.message_send_id = '$user_id'
> or message_table.message_send_id = teigi_group_table.teigi_group_id
> and teigi_group_table.teigi_num = group_table.group_id_num
> and user_table.user_num = group_table.group_user_num
> and user_table.user_id = '$user_id' ;";
>
>
> $result = pg_exec($sql);
> $rows = pg_numrows($result);
>
> この時点で
> $rowsに message_tableの総レコード数より大きい値が入っています。
> 表示してみると、同じレコードが190件表示されます。
>
> 環境は
> PHP4,PostgreSQLです。
>
> このようなことで考えられることはあるでしょうか?
>
> 皆様のご意見お待ちしています。
>
>
> ■□■ Yoshiki HORIE Presence,Inc.
> □■ mailto:yoshiki @ presence-inc.jp
> ■□ http://www.presence-inc.jp phone:022-285-5615 ■□
> living in wakabayasiku sendai city.... i'm happy to see u ! next time^^
>
pgsql-jp メーリングリストの案内