2012-10-02 67 views
0

我做了一个表上的社交网络网站的所有评论:发表评论Wallposts和评论

另外,我一个表,分配给一个评论所有评论:comment_assign

所以,我建一个函数comment()以便在每个节类型(图像,用户页面,组等)中轻松实现。在$ _GET ['s'] ==用户的情况下,我想要在这些wallposts上添加wallposts以及评论。全部存储在'评论'中。

我有了这个计划,以显示此: 1. SQL查询来获取评论 2. HTML输出 3.这个HTML输出内的另一个SQL查询来获得这个评论的规定分配的注释(wallpost情况)

现在的问题是,我的第一个查询显示所有评论。另外,评论应该是子注释。所以我的问题是,如果有任何方法可以在第一个查询中指定,那么当我收到我的所有评论时,请说:如果此comment_id可用,请在comment_assign中查找。如果是这样,不要显示这个评论,因为它是一个子评论(我会在提到的步骤3中显示)。

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


表结构:

评论

ID,UID,NID,网站,文本,日期

comment_assign

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` 
+0

分享您的查询 – m1k3y3

+0

如果我编辑我的最后一行:“AND ca.'comment_id' IS NULL”它的作品。但是,这两个查询的结构仍然不是很高效,我想呢?关于快速输出所有数据和编程效率?我应该以某种方式更改我的table_structure或将这两个查询合并为一个? – Vay

回答

1

如果我理解正确的话,您可以选择从评论表中的所有评论。然后,您需要检查comment_assign.comment_id中是否存在comment.id。如果它存在,它是一个分评论。那是对的吗?

你可以做到两种方式 - 清洁的方法是另一个字段添加到评论表,并把assign_id那里,因为每个注释只能用另一个评论相关联,或者是顶级的评论(* assign_id是NULL *)。

或者,你可以LEFT JOIN两个表。 assign_id为NULL的每一行都是墙壁注释,其每一行都有一个值意味着它被分配为一个子注释。即

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; 
+0

你好。感谢您的发布。我刚才用同样的解决方案评论了我的问题。我读过,如果没有那么多表格行不会填充数据的情况,您应该制作另一个表格。这就是为什么我没有向table'comment'添加名为assign_id的表行。所以,现在我很困惑,因为你说这将是一个干净的方式。你懂我的意思吗?另外,就像我在我的问题顶部的评论:你认为我应该以某种方式改变我的表结构或将这两个查询绑定到一个? – Vay

+0

因为以后我会用另一个while循环和SQL-Query来显示这些子注释,也用SQL连接。 – Vay

+0

对我来说,将该字段添加到原始表格是有意义的。最有可能的是,你最终会有比评论更多的评论,所以它不会是空的。但是你会保存一个查询。 如果要保存查询数据库并在代码中处理更多内容,可以选择所有注释,按* assign_id *对其排序,然后按顺序解析数组。即遍历结果,输出原始注释,然后当assign_id为NOT NULL时,将记录输出为子注释。 –