人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQL4.0 でのクエリーの作り方を教えて下さい。

掲示板の投稿一覧と各投稿への返信コメントと返信を書いたユーザ名を SELECTにて取得したいです。

データは以下のような3つのテーブルに入っています。(簡略化しています。)

postテーブル
post_id, user_id, post_comment, ...
投稿ID,ユーザID,投稿内容, ...

commentテーブル
post_id, user_id, res_comment, ...
返信した投稿ID, ユーザID, 返信コメント, ...

userテーブル
user_id, user_name, ...
ユーザID, ユーザ名, ...


MySQL4.0なのでサブクエリが利用できません。
できれば、効率的に一つのクエリにて取得したいです。


●質問者: p_question
●カテゴリ:ウェブ制作
✍キーワード:SELECT USER クエリ コメント データ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● nandedarou
●100ポイント ベストアンサー
SELECT
A.post_id,
A.user_id,
post_comment,
IF(B.user_id IS NULL,0,1) AS res_flg,
B.user_id AS res_user_id,
D.user_name AS res_user_name,
res_comment
FROM post AS A
LEFT JOIN comment AS B
USING(post_id)
LEFT JOIN user AS C
ON A.user_id = C.user_id
LEFT JOIN user AS D
ON B.user_id = D.user_id
ORDER BY post_id;

でいかがでしょうか?

次のようなテーブルを取得できると思います。

post_id,user_id,post_comment,res_flg,res_user_id,res_user_name,res_comment

投稿ID,投稿ユーザ名,投稿内容,返信の有無,返信ユーザID,返信ユーザ名,返信コメント

※res_flagカラムには、返信が有ると1、無ければ0が入ります。

※投稿一覧を表示する際、res_flgが1のときに、返信ユーザID,返信ユーザ名,返信コメント等を表示する処理をするとよいと思います。

※上記SQLの動作チェックをしておりませんので、エラー等不都合な点があったら、教えて下さい。

◎質問者からの返答

実際やってみました。

結果は取得できています。

ちゃんと伝えていなかったので申し訳ないのですが、1つの投稿にコメントが複数投稿されます。

つまり、結合した時に postテーブルのpost_idはユニークですが、その結果に対して複数のcommentテーブルのpost_idが一致し、res_commentが複数になるはずですが、多分、配列が作れないSQLの結果では、表示されていないように思いますが、このあたりはどうなっているのでしょうか?

#ポイントを差し上げたいので、コメントではなく、返答として書いて下さればと思います。


2 ● nandedarou
●100ポイント

例えば、一つのpost_idの投稿に対し、2つのコメントが有る場合

commentテーブル

post_id, user_id, res_comment

1,2,コメントA

1,3,コメントB


post_id,user_id,user_name,post_comment,res_flg,res_user_id,res_user_name,res_comment

1,1,投稿ユーザ名1,投稿内容,1,2,返信ユーザ名2,コメントA

1,1,投稿ユーザ名1,投稿内容,1,3,返信ユーザ名3,コメントB


このように、結果のテーブルのデータが2行になります。

つまり、複数の返信コメントのある投稿に対しては、そのpost_idに対応する行が複数になって、結果が返ってきます。

◎質問者からの返答

ありがとうございます。

とてもよく理解できました。

PHPで掲示板を作成しているのですが、以下のどちらの方がよく使われるのでしょうか。

1. この一部重複した結果をそのまま配列に入れて、表示側で重複しているpost_id,user_id,user_name,post_commentまでの値も入れてしまう(post_commentが大きいとメモリーを食う?)

2 クエリーを2回叩いて、PHP側でpost_idを使って連想配列を作る。(クエリーが増える分だけ遅くなる)

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ