避免mysql和php的重复结果

避免mysql和php的重复结果,php,mysql,duplicates,distinct,Php,Mysql,Duplicates,Distinct,我正在创建一个带有回复功能的评论系统,我发现遇到了一个问题 评论表 id post_id comment replyTo 0 17 Blah 2 1 17 hello 2 2 17 goodbye 3 17

我正在创建一个带有回复功能的评论系统,我发现遇到了一个问题

评论表

id post_id comment replyTo 0 17 Blah 2 1 17 hello 2 2 17 goodbye 3 17 great 1 4 17 bad
$comments = mysql_query("SELECT * FROM comment WHERE post_id='$post_id' ORDER BY id DESC");

while($comment = mysql_fetch_assoc($comments))
{
    $id = $comment['id'];

    $comment = $comment['comment'];

    $reply = $comment['replyTo'];

    echo $comment;

    echo "<br />";


    $replyQuery = mysql_query("SELECT * FROM comment WHERE replyTo='$id' ORDER BY id DESC");

    while($comment = mysql_fetch_assoc($comments))

    {

        $id = $comment['id'];

        $comment = $comment['comment'];

        $reply = $comment['replyTo'];

        echo $comment;

        echo "<br />";

     }

}
id post_id评论回复至 0 17废话2 你好 再见 3 17伟大的1 4 17差 我的代码

id post_id comment replyTo 0 17 Blah 2 1 17 hello 2 2 17 goodbye 3 17 great 1 4 17 bad
$comments = mysql_query("SELECT * FROM comment WHERE post_id='$post_id' ORDER BY id DESC");

while($comment = mysql_fetch_assoc($comments))
{
    $id = $comment['id'];

    $comment = $comment['comment'];

    $reply = $comment['replyTo'];

    echo $comment;

    echo "<br />";


    $replyQuery = mysql_query("SELECT * FROM comment WHERE replyTo='$id' ORDER BY id DESC");

    while($comment = mysql_fetch_assoc($comments))

    {

        $id = $comment['id'];

        $comment = $comment['comment'];

        $reply = $comment['replyTo'];

        echo $comment;

        echo "<br />";

     }

}
$comments=mysql\u query(“从注释中选择*,其中post\u id='$post\u id'按id顺序描述”);
while($comment=mysql\u fetch\u assoc($comments))
{
$id=$comment['id'];
$comment=$comment['comment'];
$reply=$comment['replyTo'];
回声$评论;
回声“
”; $replyQuery=mysql_query(“从注释中选择*,其中replyTo='$id'按id DESC排序”); while($comment=mysql\u fetch\u assoc($comments)) { $id=$comment['id']; $comment=$comment['comment']; $reply=$comment['replyTo']; 回声$评论; 回声“
”; } }
我的结果

Blah great hello goodbye blah hello great bad goodbye blah hello great bad 废话 伟大的 你好 再见 废话 你好 伟大的 坏的 预期结果

Blah great hello goodbye blah hello great bad goodbye blah hello great bad 再见 废话 你好 伟大的 坏的
谢谢第一行应该是:

$comments = mysql_query("SELECT * FROM comment WHERE post_id='$post_id' AND replyTo IS NULL ORDER BY id DESC");

因此,只包含顶级注释。

尝试此查询,它将在单个查询中包含所有结果

选择GROUP_CONCAT(id)作为id,GROUP_CONCAT(post_id)作为post_id,GROUP_CONCAT(comment)作为comment,GROUP_CONCAT(replyTo)作为replyTo 从post_id=17的注释按回复分组到按id描述排序

结果看起来像

id    post_id   comment      replyTo

3      17           great           1

2,4    17,17        goodbye,bad    0,0

0,1    17,17        Blah,hello     2,2
我不清楚您的要求。所以这只是一个建议…

请尝试

<?php
$comments = mysql_query("SELECT GROUP_CONCAT(id) AS id,GROUP_CONCAT(post_id) AS     post_id,GROUP_CONCAT(comment) AS comment,GROUP_CONCAT(date) AS date,GROUP_CONCAT(submittedBy)  AS submittedBy,GROUP_CONCAT(replyTo) AS replyTo FROM comment WHERE post_id='$post_id' GROUP BY replyTo ORDER BY id DESC");
while($comment = mysql_fetch_assoc($comments))
{
$cid = $comment['id'];
$comment_submit = $comment['submittedBy'];
$submitted_comment = $comment['comment'];
$comment_date = $comment['date'];
$replyTo = $comment['replyTo'];

echo'<div id="c'.$id.'" class="comment_container">';
    echo'<div class="comment_header">';
        echo'<a href="#" class="report">Flag</a>';
        echo'<a href="#" class="reply">Reply</a>';
        echo'<span>';
        echo $comment_submit.' - '.$comment_date.'</span>';
    echo'</div>';
    echo'<p>';
        echo $submitted_comment;
    echo'</p>';
    echo'
    <form method="post" class="replyForm">
        <textarea name="post_data_comment" class="replyTextArea" placeholder="@'.$comment_submit.'"></textarea>
        <input type="hidden" name="post_id" value="'.$post_id.'" />
        <input type="hidden" name="replyTo" value="'.$cid.'" />
        <div class="row_three">
            <span class="char_left_reply">Characters left: <span>500</span></span>
            <input type="button" value="Reply" name="share_reply" class="reply_comment" />
        </div>
    </form>
    ';
echo'</div>';

$reply = mysql_query("SELECT * FROM comment WHERE replyTo='$cid' ORDER BY id DESC");
while($replies = mysql_fetch_assoc($reply))
{
    $id = $replies['id'];
    $comment_submit = $replies['submittedBy'];
    $submitted_comment = $replies['comment'];
    $comment_date = $replies['date'];
    $replyTo = $replies['replyTo'];

    echo'<div id="c'.$id.'" class="comment_container" style="width:90%; float:right" >';
        echo'<div class="comment_header">';
            echo'<a href="#" class="report">Flag</a>';
            echo'<a href="#" class="reply">Reply</a>';
            echo'<span>';
            echo $comment_submit.' - '.$comment_date.'</span>';
        echo'</div>';
        echo'<p>';
            echo $submitted_comment;
        echo'</p>';
        echo'
        <form method="post" class="replyForm">
            <textarea name="post_data_comment" class="replyTextArea" placeholder="@'.$comment_submit.'"></textarea>
            <input type="hidden" name="post_id" value="'.$post_id.'" />
            <input type="hidden" name="replyTo" value="'.$cid.'" />
            <div class="row_three">
                <span class="char_left_reply">Characters left: <span>500</span></span>
                <input type="button" value="Reply" name="share_reply" class="reply_comment" />
            </div>
        </form>
        ';
    echo'</div>';
}
$comments = mysql_query("SELECT distinct(comment),id,replyTo FROM comment WHERE post_id='$post_id' ORDER BY id DESC");

while($comment = mysql_fetch_assoc($comments))
{
    $id = $comment['id'];

    $comment = $comment['comment'];

    $reply = $comment['replyTo'];

    echo $comment;

    echo "<br />";


    $replyQuery = mysql_query("SELECT * FROM comment WHERE replyTo='$id' and comment <>  '$comment' ORDER BY id DESC");

    while($comment = mysql_fetch_assoc($comments))

    {

        $id = $comment['id'];

        $comment = $comment['comment'];

        $reply = $comment['replyTo'];

        echo $comment;

        echo "<br />";

     }

}
$comments=mysql\u query(“选择distinct(comment),id,replyTo FROM comment,其中post\u id='$post\u id'按id DESC排序”);
while($comment=mysql\u fetch\u assoc($comments))
{
$id=$comment['id'];
$comment=$comment['comment'];
$reply=$comment['replyTo'];
回声$评论;
回声“
”; $replyQuery=mysql_query(“从注释中选择*,其中replyTo='$id'和注释'$comment'按id顺序描述”); while($comment=mysql\u fetch\u assoc($comments)) { $id=$comment['id']; $comment=$comment['comment']; $reply=$comment['replyTo']; 回声$评论; 回声“
”; } }
replyTo的默认值是多少?例如,其中id为2。它是空的吗?这个领域的类型是什么?为什么不发布完整的表结构?2和4都是空的,所以这些帖子不会回复任何人。顺便说一句,mysql_*函数已经过时,不应该再使用了。请考虑使用PDO或MyQuiL**,谢谢您的回复。我尝试过类似的方法,例如replyTo='',但它不会显示所有结果。您需要确保只对顶级注释执行该条件。你也有命名冲突,我一开始没有注意到。在外循环中创建的变量在内循环中被覆盖。请确保内部循环没有修改变量$reply。这不是很有帮助。你能把修改过的代码贴出来吗?还有,你是如何运行它的?它是一个函数还是另一个函数的一部分,等等?谢谢!我是否也将同样的查询应用于内部循环?谢谢您的回复。有了这个,我没有得到我想要的结果。请再次检查,我编辑了它。我希望它会返回我想要的结果