获取 mysql 行,除非它是重复的,在这种情况下忽略它

Posted

技术标签:

【中文标题】获取 mysql 行,除非它是重复的,在这种情况下忽略它【英文标题】:Fetch mysql row unless it's a duplicate, in which case ignore it 【发布时间】:2014-09-21 11:30:17 【问题描述】:

我坚持这一点。我想做的是这个。一个通知系统。当我对某事发表评论时,我需要它来让之前评论过的所有其他用户向他们发送通知以及该项目的所有者,该帖子有新的活动。

这就是问题所在。我在帖子下方填充了一个评论框,您写下您的评论,然后按 Enter,它会将您评论的帖子 ID 以及您的用户名和评论发送到一个调用函数以发送通知的 php 脚本.

因此,作为隐藏输入,我将从评论表单中的数据库中提取之前对帖子发表评论的任何人。这就是问题所在,假设用户 A 发表了 3 次评论,数据库会将他作为评论者 3 次,因此他的姓名将作为三个不同的输入被拉入评论表单。以下是拉动先前评论者的 mysql 调用的一些代码:

// Query the comments to see who has commented.
// Their username will be in the owner column.
// $postid is being pulled from the actual post id that you are commenting on.
// At this point the post content and previous comments are already
// processed, this is just processing the comment form.

$sql = "SELECT * FROM comments WHERE postid = '$postid'";
$result = mysqli_query($con,$sql);

while($row = mysqli_fetch_array($result))
    echo '<input type="hidden" name="commented[]" value="'.$row['owner'].'" />';    

如果用户 A 发表了 4 次评论,评论表单将如下所示,那么:

<form id="comment-form-##">
    <input type="hidden" name="commented[]" value="usera" />
    <input type="hidden" name="commented[]" value="usera" />
    <input type="hidden" name="commented[]" value="usera" />
    <input type="hidden" name="commented[]" value="usera" />
    <input type="hidden" name="commented[]" value="userc" />
    <input type="hidden" name="commented[]" value="userc" />

// And the id of the post you're commenting on
    <input type="hidden" name="postid" value="24" />

// And then the actual input box for your comment:
    <input type="text" name="comment" placeholder="Write a comment" />

那么我怎样才能拉出之前评论过的用户,并跳过他们在数据库中的多个列表。理想情况下,我希望评论表单在完成后看起来像这样:

<form id="comment-form-##">
    <input type="hidden" name="commented[]" value="usera" />
    <input type="hidden" name="commented[]" value="userc" />

// And the id of the post you're commenting on
    <input type="hidden" name="postid" value="24" />

// And then the actual input box for your comment:
    <input type="text" name="comment" placeholder="Write a comment" />

希望有办法做到这一点,因为这是我第一次想到如何将新活动通知以前的评论者。感谢您在这里获得的所有帮助。

【问题讨论】:

【参考方案1】:

工作量太大。

SELECT DISTINCT owner
  FROM comments
  WHERE postid = ?

【讨论】:

【参考方案2】:

这就是我的建议,将所有所有者插入一个数组,然后在其上使用 array_unique 以便删除重复项,然后运行一个 foreach 循环来显示隐藏的表单字段

$sql = "SELECT * FROM comments WHERE postid = '$postid'";
$result = mysqli_query($con,$sql);
$owners = array();
while($row = mysqli_fetch_array($result)) $owners[] = $row['owner'];
$owners = array_unique($owners);
foreach($owners as $owner) echo '<input type="hidden" name="commented[]" value="'.$owner.'" />';    

另外,让我提一下,我认为这不是做你想做的最好的方式。这些隐藏的表单字段很容易被篡改,您会向错误的人发送通知。

由于您将 post_id 作为隐藏表单字段发送到通知人们的页面,我建议您修改该页面,以便查询对特定 post_id 发表评论的每个人,但当前正在评论的人除外,并向他们发送通知而不是简单地在隐藏的表单字段中添加他们的 ID。

【讨论】:

【参考方案3】:

这应该可以工作

SELECT * FROM comments WHERE postid = '$postid' GROUP BY owner

【讨论】:

这会和我标记为答案的一样有效。我标记那个的唯一原因是因为我真的只需要“所有者”列,并且我将沿着这些响应列表向下工作,直到找到一个有效的,所以我很自然地首先尝试了。谢谢!【参考方案4】:

将您的查询更改为

$sql = "SELECT DISTINCT owner from cmets where postid = '$postid'";

然后你会得到一个没有任何重复评论的用户列表。

【讨论】:

以上是关于获取 mysql 行,除非它是重复的,在这种情况下忽略它的主要内容,如果未能解决你的问题,请参考以下文章

在这种情况下如何使用 UNION (MySQL) [重复]

MySQL:在不破坏外键约束的情况下消除重复行

MySQL 日期时间与前一行的比较

mysql怎么去除重复数据

MySQL可重复读防止幻读

二叉搜索树根节点保持为空