0

質問自体が間違って書かれている可能性があるので、誰かがそれを定義する方法をよりよく知っている場合は、質問を編集してください。


構造

重要な列のみ。

コメント

  • comment_id
  • comment_parent_id
  • ユーザーID
  • コメント_テキスト

投稿

  • post_id
  • ユーザーID
  • post_text

comments_to_post (comments_to_foos、comments_to_bars、...)

  • comment_id
  • post_id (foo_id、bar_id、...)

comments_to_post他のすべてのコメントは別のコメントの単なる子であるため、 on がcomment_parent_idオンのコメントへの接続のみがあります。commentsNULL


post_id結果として、特定の投稿 (by ) とその子に割り当てられたコメントが表示されるクエリに苦労しています。

どこから選択しcommentsて参加しようとしたのですが、 でつながっているだけなので、のコメントしか得られなかったのも不思議ではありません。comments_to_postpost_id = ?NULL comment_parent_idcomments_to_post

子であるコメントも結果に追加する方法は?


サンプルデータ:

コメント

comment_id comment_parent_id
1          NULL
2          1
3          1
4          NULL
5          4

投稿

post_id
10
20

コメントへの投稿

comment_id post_id
1          10
4          20

期待される結果

... where post_id = 10

comment_id
1
2
3
4

2 に答える 2

1

post_idテーブルにフィールドを追加するcomments必要があります (この場合、テーブルは必要ありませんcomments_to_posts)。この場合のみ、1 回のデータベース要求ですべてのコメントとサブコメントを選択できます。

また、ツリー構造のデータ (コメント、メニューなど) が必要な場合は、http://en.wikipedia.org/wiki/Nested_set_modelについて読むことをお勧めします。この問題を解決するのは、非常に興味深くエレガントなアプローチです。

于 2013-09-08T20:46:58.910 に答える
1

アップデート -

以下に示すように、これはなくても実行できUNIONます。どちらのアプローチも、単一レベルのコメント スレッドに対してのみ機能することに注意してください。

SELECT c.*
FROM comments_to_post ctp , comments c
WHERE ctp.post_id = 1
  AND ( c.comment_id = ctp.comment_id OR c.comment_parent_id = ctp.comment_id)

最初に親のコメントを取得し、次に子を取得し、それらすべてを UNION します。DEMO fiddleを参照してください。

SELECT c.*
FROM comments_to_post ctp , comments c
WHERE ctp.post_id = 1
  AND c.comment_id = ctp.comment_id

UNION ALL

SELECT c.*
FROM comments_to_post ctp , comments c
WHERE ctp.post_id = 1
  AND ctp.comment_id = c.comment_parent_id
ORDER BY comment_id
于 2013-09-08T20:54:58.007 に答える