1

次のフィールドを持つ親と子のコメントを持つコメントテーブルがあります

comments
    comment_id
    parent_id
    thread_id (Foreign Key)
    title
    body
    comment_date
    user_name

最初に親コメントが表示され、次にその子コメントが表示され、次に親コメントが表示され、次にその子コメントが表示されるこのフォームのコメントを整理したい

次のクエリを使用しています

SELECT c1 . * , c2 . * 
FROM comments c1
LEFT JOIN comments c2 ON c2.parent_id = c1.comment_id
WHERE c1.parent_id IS NULL 
AND c1.thread_id =122

次の出力が得られます ここに画像の説明を入力

最初のテーブルに非常に多くの重複行があることがわかります

次の出力が必要です

ここに画像の説明を入力

この出力では、最初に親コメント (parent_id に NULL を含む)、次にその子コメント、次に次の親コメント、そしてその子コメントが来ることがわかります。

この出力を取得するために SQL クエリを作成するにはどうすればよいですか。注: (2 番目の画像はクエリの結果ではありません。私の視点を明確にし、どのような出力が必要かを伝えるために変更しました。)

4

3 に答える 3

3

重複している行はありません。c1表向きは多くのc2コメントの親であるため、コメントが繰り返し選択されるだけです。実際には 2 つの別々のクエリが必要なようです。

SELECT * FROM comments WHERE parent_id IS NULL AND thread_id = 122
UNION
SELECT c2.* FROM comments c1 JOIN comments c2 ON c2.parent_id = c1.comment_id
WHERE c1.parent_id IS NULL AND c1.thread_id =122
于 2013-04-10T07:08:44.713 に答える
0
SELECT c1 . * , c2 . * 
FROM comments c1
LEFT JOIN comments c2 ON c2.parent_id = c1.comment_id
WHERE c2.parent_id IS NOT NULL 
AND c1.thread_id = 122

テーブルを作成し、上記のクエリでテストしましたが、問題なく動作します。上記がうまくいかない場合は、コメント テーブルをエクスポートして、ここに投稿してください。正確なクエリを送信します。

繰り返しますが、cakephp にある場合は、検索クエリで「threaded」を使用します。これは、データベースの親子型テーブル構造に対して常に正常に機能します。

応答を待っています...

于 2013-04-10T07:53:23.010 に答える
0
SELECT c1 . *
FROM comments c1
RIGHT JOIN comments c2 ON c2.parent_id = c1.comment_id
WHERE c1.parent_id IS NULL 
AND c1.thread_id =122
于 2013-04-10T07:17:39.540 に答える