mysql - 不计算 "LIMIT"中的某些列

标签 mysql database-design relational-database

我有一个系统,其中可以有“帖子”、对帖子的“评论”以及对其他评论的“评论”。将其视为一个非常简化的 Facebook 评论系统。

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

ID(评论或帖子)| TopParentID(如果是帖子,则与 ID 相同,如果是评论,则与帖子 ID)| DirectParentID(如果是帖子,则为 0;如果是帖子 ID,则为帖子 ID,如果是评论,则为父评论 ID)|还有一些帖子和评论相同的字段

我想要实现的目标:例如,选择前 20 篇帖子。但是,对于帖子,还要选择该帖子的评论。

我知道这听起来像是与另一个表的 JOIN 比只有一个表更优化,但我认为让帖子和评论使用相同的 ID 计数器会更有利,以使其更容易查找对帖子的直接评论以及对帖子评论的评论。

但是,我不知道如何使用上面的表设计来设计我的查询;我需要选择 DirectParentID = 0 的前 x 行,以及 TopParentID = 每个选定行的帖子 ID 的行。

我到底应该改变我的表格设计吗?

最佳答案

你可以这样做:

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; 

你的设计没有任何问题。自引用表很常见。您可以认为您的表包含“可评论对象”,评论和帖子都可以归入其中。但是,对于将帖子和评论视为单个实体的表,创建将帖子和评论视为两个单独实体的查询可能会更困难/更复杂(至少,对我来说就是这样:))

关于mysql - 不计算 "LIMIT"中的某些列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49088016/

相关文章:

asp.net-mvc - 数据库中未注册的用户

MySQL 数据库规范化、关系和外键的最佳方法

database - DB::table ('table' ) 和 model::('table' ) 之间的区别

mysql - Drupal MySQL 查询优化

mysql - CakePHP:查找关联模型的工作方式与文档声明不同

java - MySQL MBRContains 语句抛出 SQLException 错误

database-design - 标准化这个数据库 : what would be ideal in this scenario?

mysql - 按升序创建 MYSQL 行

c# - SQL 表引用多个外键,同时定义顺序并保证参照完整性

mysql - 如何根据每个可预订实体每天都有不同时间表的时间段构建和查询约会系统?