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