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