0

我为社交网站上的所有评论制作了一张表格:comment

另外,我有一张表用于分配给一条评论的所有评论:comment_assign

因此,我构建了一个函数 comment() 以便在每个部分类型(图像、用户页面、组等)中轻松实现它。在 $_GET['s']==user 的情况下,我希望有墙贴以及对这些墙贴的评论。全部存储在“评论”中。

我有这个方案来显示这个: 1. 用于获取评论的 sql 查询 2. html 输出 3. 此 html 输出中的另一个 sql 查询以获取评论的指定分配评论(在本例中为墙贴)

现在的问题是我的第一个查询显示了所有评论。还有应该是子评论的评论。所以我的问题是,如果有任何方法可以在第一个查询中指定,当我得到所有评论时,说:如果这个comment_id 可用,请查看comment_assign。如果是,请不要显示此评论,因为它是子评论(我将在提到的步骤 3 中显示)。

也许整个结构可能会改变?我将不胜感激任何建议。甚至难以实现,但这将是最有效的。


表结构:

评论

id、uid、nid、站点、文本、日期

评论分配

comment_id,assign_id


第一个 SQL 查询示例,它不能避免显示所有评论(也分配的评论)。见最后一行:

SELECT *    
FROM `comments` AS c
LEFT JOIN `comment_assign` AS ca ON ca.`comment_id` = c.`id` 
LEFT JOIN `users` AS u ON c.`uid` = u.`id` 

WHERE c.`nid`='".$nid."' 
AND c.`site`='".$_GET['s']."' 
AND ca.`comment_id` != c.`id`
4

1 回答 1

1

如果我理解正确,您可以从评论表中选择所有评论。然后您要检查comment.id 是否存在于comment_assign.comment_id 中。如果存在,则为子注释。那是对的吗?

您可以通过两种方式做到这一点 - 干净的方法是在评论表中添加另一个字段并将 assign_id 放在那里,因为每个评论只能与另一个评论相关联,或者是顶级评论(*assign_id 为 NULL*)。

或者,您可以 LEFT JOIN 两个表。assign_id 为 NULL 的每一行都是墙评论,它有值的每一行都意味着它被分配为子评论。IE

SELECT id, uid, site, text, date
FROM comment
LEFT JOIN comment_assign ON (comment.id = comment_assign.comment_id)
WHERE comment_assign.assign_id IS NULL;
于 2012-10-02T14:23:39.297 回答