1

これは私のデータベースがどのように見えるかです

コメント

id 1 - (primary key)
user_id 2
comment - I need help

id 2 - (primary key)
user_id 
comment - I'm going to sleep now

id 3 - (primary key)
user_id 2
comment - Watching the news. 

返信

id 1
comment_id 1 (foreign key)
reply - what do you need help with?

id 2
comment_id 1 (foreign key)
reply - i can help you!

id 3
comment_id 1 (foreign key)
reply - i don't understand!

id 4
comment_id 2 (foreign key)
reply - OK have a good night.


問題は、コメントを次のようにネストして表示することです。

コメント - 助けが必要です

--- 返信 - 何の助けが必要ですか?
- - お手伝いしましょう!
- - - 理解できない!

コメント - もう寝ます

--- 返信 - はい、おやすみなさい。

コメント - ニュースを見ています。

- - 応答なし

これは私が今得ているものではありません。

コメント - 助けが必要です

--- 返信 - 何の助けが必要ですか?

コメント - 助けが必要です

- - お手伝いしましょう!

コメント - 助けが必要です

- - 理解できない!

コメント - もう寝ます

--- 返信 - はい、おやすみなさい。

コメント - ニュースを見ています。

- - 応答なし

これは私のクエリです

$query = $db->prepare("SELECT 

comments.id, 
comments.user_id,
comments.comment, 

replies.id,
replies.comment_id,
replies.reply

FROM comments
LEFT JOIN replies 
ON comments.id = replies.comment_id
WHERE comments.user_id = ? ORDER BY comments.id DESC");

try {
$query->execute();              

while($row = $query->fetch(PDO::FETCH_ASSOC)) {

$comm_id = $row['id'];
$comm_user_id = $row['user_id']; 
$comm = $row['comment'];

$re_id = $row['id']; 
$re_comm_id = $row['comment_id'];
$re_reply = $row['reply'];

echo $comm." - ".$re_reply;

}

} catch (PDOException $e) {
echo $e->getMessage();
exit();
}

問題は明らかにクエリ構造にありますが、目的の結果を得るために構造化する方法がわかりません。

私は自分自身を十分に明確に説明したいと思います.事前に助けてくれてありがとう.

4

1 に答える 1

0

最初に、replies.id後で参照できるようにエイリアスを持つようにクエリを変更します。

SELECT comments.id, comments.user_id, comments.comment, 
  replies.id reply_id, replies.comment_id, replies.reply
FROM comments
LEFT JOIN replies 
ON comments.id = replies.comment_id
WHERE comments.user_id = ? ORDER BY comments.id DESC

最初に comment_id で返信をグループ化できます。

<?php
$comments = array();
$comm_replies = array();
while($row = $query->fetch(PDO::FETCH_ASSOC)) {

    $comm_id = $row['id'];
    $comm_user_id = $row['user_id']; 
    $comm = $row['comment'];

    if (empty($row['reply_id'])) {
      continue;    
    }

    $comments[$comm_id] = $comm;
    $comm_replies[$comm_id][] = $row;
}

foreach ($comments as $comm_id => $comm) {
    echo "comment - $comm\n";
    if (!isset($comm_replies[$comm_id])) {
        continue;
    }

    $prefix = '---';
    foreach ($comm_replies[$comm_id] as $reply_id => $row) {
        echo "$prefix $row['reply_id'], $row['reply']\n";
        $prefix .= '-';
    }
}
于 2014-06-16T03:38:54.730 に答える