【问题标题】:MySQL - COUNT and retrieve n rows from a subqueryMySQL - COUNT 并从子查询中检索 n 行
【发布时间】:2012-03-11 03:01:46
【问题描述】:

上下文:

  • 我有一个在主页上显示帖子和 cmets 的应用程序。
  • 我的目的是限制显示的帖子数量(即 10 个帖子)并且...
  • 限制每个帖子显示的 cmets 数量(即 2 cmets)。
  • 在前端显示cmets的总数(即“读取所有10个cmets”)

MySQL:

(SELECT *
 FROM   (SELECT *
         FROM   post
         ORDER  BY post_timestamp DESC
         LIMIT  0, 10) AS p
        JOIN user_profiles
          ON user_id = p.post_author_id
        LEFT JOIN (SELECT *
                   FROM   data
                          JOIN pts
                            ON pts_id = pts_id_fk) AS d
          ON d.data_id = p.data_id_fk
        LEFT JOIN (SELECT *
                   FROM   comment
                          JOIN user_profiles
                            ON user_id = comment_author_id
                   ORDER  BY comment_id ASC) AS c
          ON p.post_id = c.post_id_fk))

我未能在此代码中插入 LIMIT 和 COUNT 以获得我想要的 - 有什么建议吗? - 如果需要,我们很乐意发布更多信息。

【问题讨论】:

  • 请显示您的架构。很难对无效的查询进行逆向工程。

标签: mysql sql subquery greatest-n-per-group


【解决方案1】:

如果我对您的理解正确,您希望返回的结果集中的每个唯一用户不超过 10 个帖子(和 2 个 cmets)。

这在 SQLServer/Oracle/Postgre 中使用“row_number() PARTITION BY”非常容易。

可惜MySql中没有这个功能。类似的问题已在此处提出:
ROW_NUMBER() in MySQL

很抱歉,我无法为 MySql 提供更具体的解决方案。肯定会进一步研究 MySql 的“行号分区”等价物。

这样做的本质:

您可以添加一组组成唯一集的列,例如用户 ID(例如,sake)(这是“分区”)然后将“行号”列添加到与分区匹配的每一行并重新开始当它改变时。

这应该说明:

user_id  row_number
1        1
1        2
1        3
2        1
2        2

然后,您可以添加一个外部查询:select where row_number

祝你好运!

【讨论】:

    【解决方案2】:

    这是您要查找的查询的框架:

    select * from (
      select p1.id from posts p1
      join posts p2 on p1.id <= p2.id
      group by p1.id
      having count(*) <= 3
      order by p1.post_timestamp desc
    ) p left join (
      select c1.id, c2.post_id from comments c1
      join comments c2 on c1.id <= c2.id and c1.post_id = c2.post_id
      group by c1.id
      having count(*) <= 2
      order by c1.comment_timestamp desc
    ) c
    on p.id = c.post_id
    

    它将获取按时间戳降序排列的帖子,但只有前 3 个。该结果将通过降序时间戳与每个发布订单的前 2 个 cmets 连接。只需更改列名即可:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 2019-10-23
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多