• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:3つのテーブルからのデータ抽出)

3つのテーブルからのデータ抽出

このQ&Aのポイント
  • 3つのテーブルからデータを抽出する際に、期待した結果が得られない状況です。
  • 質問の内容は、memberテーブルのidが3の順子を検索し、friendテーブルのf_idを参照して相手の名前を取得し、diaryテーブルでその人の発言を表示することです。
  • しかし、自分の発言が2回表示される状態になっています。SQL文を確認し、試行錯誤を繰り返していますが、期待した結果を得ることができません。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

別々で集計してUNIONで結合するのが妥当では?

sadacha
質問者

お礼

yambejp様 こんばんは。いつもお世話になっております。 >別々で集計してUNIONで結合するのが妥当では? なるほど~こういうやり方があったんだ~・・と思いつつ、 $sql = "select c.subject,m2.n_name,c.date,c.no,f.f_id from member as m inner join friend as f on m.id=f.id and m.id=$id inner join diary as c on f.f_id=c.id inner join member as m2 on m2.id=c.id order by no desc LIMIT 0, 30;"; という自分以外のデータを表示するSQL(以前お教えいただいたSQLを参考にしています)と、UNIONで結合すべく、UNIONで結合すべき条件としてデータ型を揃えるなどとあったので、自分のみを表示するSQLを先SQLを変更したところ、当初に質問にも記載したように、自分の発言が2度出る状態となっていたため、 $sql = "select c.`id`, c.`no`, c.`subject`, c.`date`, m.`id`, m.`n_name` FROM diary as c INNER JOIN member as m ON c.`id` = m.`id` WHERE c.`id` = $tb_id order by c.`date` desc limit 0, 30;"; とし、UNIONで結合してみたのですが上手くいきません。 今回、yambejp様のアドバイスでUNION(今まで使ったことがない)を知り(恥)、一気に道が開けたような気がしたのですが、いまいち理解に苦しんでおります。 このお礼(報告)の後も、解決に向け引続き調べてはいきますが、お時間が許されるなら、引続きご指導いただければ幸いです。 お忙しい中恐縮ですが、宜しくお願いいたします。

sadacha
質問者

補足

yambejp様 こんばんは。お世話になっております。 随分と時間が掛かってしまいましたが、以下のSQLで、とりあえず期待の結果を得ることが出来ました。 まだまだ不完全なSQLかとは思いますが、結果を得ることが出来たのもyambejp様のアドバイスあってのことです。有難う御座いました。 $sql = "(select m.id, c.subject,m2.n_name,c.date,c.no,NULL,f.f_id from member as m inner join friend as f on m.id=f.f_id and f.id=$tb_id inner join diary as c on f.f_id=c.id inner join member as m2 on m2.id=c.id order by no desc LIMIT 0, 30) UNION ALL (select m.`id`, c.`subject`, m.`n_name`, c.`date`, c.`no`, c.`id`, NULL FROM diary as c INNER JOIN member as m ON c.`id` = m.`id` WHERE c.`id` = $tb_id order by c.`no` desc LIMIT 0, 30) order by no desc";