[pgsql-jp: 28508] Re: SQLでの質問
KAWAI,Takanori
GCD00051 @ nifty.ne.jp
2002年 12月 28日 (土) 09:27:23 JST
川合孝典です。
大垣さんの書かれている通りSQLの入門書を読むことは
強くお勧めします。
また確認だけであればPHPよりはpsqlで確認したほうがわかり
やすいんじゃないかとは思いますが。
----- Original Message -----
From: "yoshiki(R)HORIE" <yoshiki @ presence-inc.jp>
To: <pgsql-jp @ ml.postgresql.jp>
Sent: Saturday, December 28, 2002 2:28 AM
Subject: [pgsql-jp: 28505] Re: SQLでの質問
> すみません。
> 再質問です。
>
> select文を下記のように変更しました
>
> $sql_01 = "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
> 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') ;";
>
> message_tableには3件のレコードです。
> 結果は、190件のレコードが返ってきました。
>
> どのように理解すれば、よろしいでしょうか。ご教授いただけますでしょうか?
上記のSQLを(上記のSQLだとエラーになりそうに思うのですが)
select message_table.message_num,
teigi_group_table.teigi_num,
group_table.group_num,
user_table.user_num
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');
のように各テーブルのプライマリーキーを選択するように変えてみれば
(user_tableはわからなかったので適当に書いていますが)
各テーブルのレコードの組み合わせになっているんじゃないかと
思います。
#各レコードがどんなものなのか、これまでの情報ではわかりませんが。
問題はWHEREでの先頭の条件とFROMに並べたテーブルでしょう。
先頭の条件が成立すれば、それでOKですから、
message_tableのmessage_send_id='$user_id'が成立するレコード と
残りのテーブルの全てのレコードとの組み合わせになっているんじゃ
ないかと思っています。
見た感じWHERE節でのORの前後では全く違う条件でしょうから
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
where
message_table.message_send_id = '$user_id' or
EXISTS(
select user_table.user_id
from group_table, user_table, teigi_group_table
where
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_num and
user_table.user_id = '$user_id');
のように複文にするとか
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, group_table.group_num
from message_table
where
message_table.message_send_id = '$user_id'
union
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 = 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_num and
user_table.user_id = '$user_id');
のようにunionにしてみるとか?
もっとも、それ以前の問題としてテーブル設計として、これでいいのか
見直されてもよいのでは?
===================================================
川合 孝典 (Hippo2000)
DBI日本語メーリングリスト管理人、Kansai.pm所属
kwitknr @ cpan.org GCD00051 @ nifty.ne.jp
http://member.nifty.ne.jp/hippo2000、http://www.hippo2000.info/
perldocの日本語化ならperldocjp:翻訳してみませんか?
http://sourceforge.jp/projects/perldocjp
===================================================
pgsql-jp メーリングリストの案内