MySQL选择儿童(树/链结构)

时间:2013-08-08 16:30:50

标签: mysql

这有点不寻常,因此它让我觉得我做错了。我为我的网站创建了评论,这些评论都存储在一个表中,无论主题是用户,帖子,照片还是其他什么。我为此创建了一个名为type的列,其类型分别为0 = user1 = post2 = photo等。但我还决定添加回复评论的选项,它是无限期的。所以我只是在表中添加了一个reply列,其中包含给定注释作为回复的注释的ID。我知道这可能会让我感到困惑但与我无关。所以现在如果要显示某张照片的评论,我会选择它们

SELECT `stuff` 
FROM `opinions`
WHERE `type`=2

然后,说一些评论已回复他们,为了得到那些我首先要检查每个评论是否有任何回复,如果是,那么发送另一个SQL请求来获取回复并做同样的事情对于获取的回复等等,这似乎有点..错了。有人能引导我走向正义之路并向我展示光明吗?

表格结构(如果需要)

CREATE TABLE `opinions` (  
    `id` int(11) NOT NULL AUTO_INCREMENT,  
    `type` tinyint(3) unsigned NOT NULL,  
    `reply` int(11) NOT NULL,  
    `recipient` int(11) unsigned NOT NULL,  
    `sender` int(11) unsigned NOT NULL,  
    `opinion` text NOT NULL,  
    `time` int(11) NOT NULL
)

编辑:谢谢你们的帮助,但所有这些看起来都很复杂,我似乎无法理解如何实现它,因为我有无限数量的孩子和给出的大多数例子有很多孩子和东西。除非有人愿意花时间向我解释一下这对于一个完整的白痴,我将只是通过ajax调用来加载回复。再次感谢你,当然还有+代表!

2 个答案:

答案 0 :(得分:1)

我认为你在oracle中寻找像connect by prior这样的东西看到这篇文章,这应该对你有帮助。

http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/

您也可以使用Tree Order Traversal alghoritm(您也可以在维基百科上找到它),但每次添加/删除某些内容时,都需要重新计算leftright值表

答案 1 :(得分:1)

您可以使用MPTT或也称为嵌套集表 http://www.sitepoint.com/hierarchical-data-database-2/

读取查询不利于写入/更新:)