投稿にネストされたコメントが添付されたアプリをセットアップしました。コメントにクロージャ テーブル方式 (スライド 40)を使用することにしました。これは、ハード ディスク容量がいかに安価であるかと比べて、ツリー構造のクエリと管理がいかに簡単に見えるかという理由によるものです。しかし、問題が発生しています。祖先 ID ではなく、投稿 ID に基づいてツリー パスを取得する方法がわかりません (スライド 49)。
私のデータベース構造は次のようになります。
table: comment_paths
--------------------
parent_id (fk on comments.id)
child_id (fk on comments.id)
depth
table: comments
---------------
id
parent_id (fk on comments.id)
post_id (fk on posts.id)
text
table: posts
---------------
id
name
スライドショーのように、事前にparent_idがわかっている場合は、ツリーを簡単に取得できます:
SELECT c.*, p.*
FROM comments AS c
JOIN comment_paths AS p
ON c.id = p.child_id
WHERE p.parent_id = 1
parent_id
ただし、事前にわかりません。しか知らないpost_id
。データベースのセットアップ方法では、投稿に複数のツリーが関連付けられています。
[post]
-----------------------------------------
[comment] [comment] [comment] depth: 0
| |
[reply] [reply] depth: 1
| |
[r] [r] depth: 2
私の最初の解決策は、次のようなクエリでした。
SELECT c.*, p.*
FROM comments AS c
JOIN comment_paths AS p
ON c.id = p.child_id
WHERE p.parent_id IN
(SELECT id FROM comments WHERE parent_id IS NULL AND post_id = 6)
それは正しいデータを返しますが、そのような入れ子になった SELECT は正しくないように感じます。これを行うより良い方法はありますか?
ありがとう!