不要计算" LIMIT"中的某些列。

时间:2018-03-03 18:59:45

标签: mysql database-design relational-database

我有一个系统可以有"帖子","评论"到帖子,"评论"其他评论。可以把它想象成一个非常简化的Facebook评论系统。

为了支持数据,我选择使用一个表作为帖子和评论,因为它们的结构几乎相同:

ID(评论或帖子)| TopParentID(如果是帖子,与ID相同,如果是评论,帖子的ID)| DirectParentID(如果发布,则为0,如果发表评论,则为帖子的ID或父评论的ID)|发布和评论的其他一些字段相同

我想要实现的目标:例如,选择前20个帖子。但是,通过帖子,还可以选择该帖子的评论。

我知道这听起来像是另一个表的JOIN比仅有一个表更优化的东西,但我认为让帖子和评论都使用相同的ID计数器会更方便查找对帖子的直接评论,以及评论帖子的评论。

但是,我不知道如何使用上面的表格设计我的查询;我不知何故需要选择DirectParentID = 0的前x行,还要选择其中TopParentID =每个所选行的post id的行。

毕竟我应该改变我的桌面设计吗?

2 个答案:

答案 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所有帖子/评论,加上一个简单的标记,说明哪个是原始帖子。