MySQL LIMIT 0,15 其中 15 是 parent_ids 的数量,不是 child

标签 mysql sql join limit

我有一张表,我正在尝试为 ajax 分页获取评论。

你可以在这里看到一个 SQLFiddle:

http://sqlfiddle.com/#!2/5d36a/1

但基本上,如果没有 0,15LIMIT,它会按预期工作:

例如所有子评论都将与父评论一起显示/显示在父评论下方。

当我引入LIMIT 时问题就来了。在上面的例子中,它会获取 15 条评论,但是因为第 16 条评论是 id=6 的评论的子评论,所以它不会被返回。如果将其更改为 LIMIT 0,16,它将正确返回。

基本上我一次只想返回 0,15 个父评论,但不限制子评论。

有人告诉我尝试一个临时表,但后来有人告诉我它可能更简单(并且只使用一个带有内部选择的连接),但我有点困惑。

最佳答案

您可以使用以下查询使其工作:

SELECT 
  comment.id,
  comment.deleted,
  comment.comment,
  comment.user_id,
  comment.created,
  comment.parent_id,
  s.id as sid,
  s.user_id submissionUserId,
  u.username,
  u.photo AS userPhoto
FROM (SELECT c.* 
      FROM submissions_comments AS c
      WHERE c.parent_id IS NULL
      ORDER BY c.created DESC
      LIMIT 0, 15) AS base
LEFT JOIN submissions_comments AS comment ON (
  comment.parent_id = base.id 
  OR comment.id = base.id
)
LEFT JOIN users u ON comment.user_id = u.id
LEFT JOIN submissions s ON comment.submission_id = s.id
WHERE base.deleted = 0
ORDER BY base.created DESC

您可以看到它的实际效果:http://sqlfiddle.com/#!2/6d90f5/1

但我不知道它在性能方面是否有效。

它主要做的是:

  • 在子查询(或内部查询)中抓取前 15 个父评论
  • 对于每个获取 child parent 的副本

关于MySQL LIMIT 0,15 其中 15 是 parent_ids 的数量,不是 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25277403/

相关文章:

linq - NHibernate 3 LINQ 内连接问题与三个跳转 : NotSupportedException

php - 连接mysql中的2个表,返回不相关的行

javascript - 与 Array.join() 的不同结果

PHP 会跳过检查并插入数据,即使数据已经存在

php - ACL(访问控制列表)Codeigniter 按用户 ID 而非角色

mysql - 创建 Sql 查询以组合两个表并打乱结果

基于日期的 SQL Case 语句

java - 加快 Lucene 索引构建过程

mysql - 每分钟更新一次列表的事件

sql - 在 SQL 中对多个 SELECT 结果执行数学运算