我有一个系统可以有"帖子","评论"到帖子,"评论"其他评论。可以把它想象成一个非常简化的Facebook评论系统。
为了支持数据,我选择使用一个表作为帖子和评论,因为它们的结构几乎相同:
ID(评论或帖子)| TopParentID(如果是帖子,与ID相同,如果是评论,帖子的ID)| DirectParentID(如果发布,则为0,如果发表评论,则为帖子的ID或父评论的ID)|发布和评论的其他一些字段相同
我想要实现的目标:例如,选择前20个帖子。但是,通过帖子,还可以选择该帖子的评论。
我知道这听起来像是另一个表的JOIN比仅有一个表更优化的东西,但我认为让帖子和评论都使用相同的ID计数器会更方便查找对帖子的直接评论,以及评论帖子的评论。
但是,我不知道如何使用上面的表格设计我的查询;我不知何故需要选择DirectParentID = 0的前x行,还要选择其中TopParentID =每个所选行的post id的行。
毕竟我应该改变我的桌面设计吗?
答案 0 :(得分:0)
你可以这样做:
SELECT *
FROM t
WHERE topParentId IN (SELECT id
FROM t
WHERE directParentId = 0
AND id <= 20);
LIMIT
不能在子查询中使用,因此您需要一个where子句来过滤掉您的父帖子(可能是日期或用户或其他内容)。
如果你想使用限制,你可以像这样使用'自联接':
SELECT t.*
FROM (SELECT *
FROM t
WHERE t.did = 0
LIMIT 20) AS t1
INNER JOIN t
ON t.tid = t1.id;
您的设计没有任何问题。自引用表很常见。您可以认为您的表格包含“可评论的对象”,并且评论和帖子都可以归类为该表。但是,将帖子和评论视为两个独立实体的查询可能更难/更复杂地创建一个表将它们视为单个实体(至少,对我来说就是这种情况:))
答案 1 :(得分:0)
我建议你有一个表用于&#34;线程&#34;加上一个表格,用于&#34;评论&#34;。可能&#34;帖子&#34;可以简单地使用注释抛出,但也不要尝试将Thread放入。
如果您想要一个层次结构(评论评论),则应仅通过directParentId = 0
将帖子与评论区分开来。
如果您不想要一个层次结构,那么您需要的只是thread_id
所有帖子/评论,加上一个简单的标记,说明哪个是原始帖子。