2012-03-11 46 views
0

上下文检索n行:MySQL的 - 计数以及从子查询

  • 我有一个应用程序,显示在主页上的帖子和评论。
  • 我的目的是限制显示职位(即10个)的
  • 限制每个职位(即2条评论)显示评论数的数量和...。
  • 显示在前端(即“阅读所有10条评论”)的评论总数

的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)) 

我没在这个代码中插入LIMITCOUNT得到我想要的 - 有什么建议? - 如果需要,将很高兴发布更多信息。

+0

请显示您的架构。对非工作查询进行反向工程很困难。 – 2012-03-11 03:52:45

回答

0

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

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

不幸的是在MySql中没有这样的功能。类似的问题已经在这里问:
ROW_NUMBER() in MySQL

对不起,我不能提供一个更具体的MySql解决方案。绝对会进一步研究MySql的“行号分区”。

的这是什么一样的精髓:

您可以添加一组构成了一个独特的列集,例如说为了用户ID(这是“分区”)“行数字“列将被添加到与分区匹配的每一行,并在其更改时重新开始。

这应该说明:

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

然后,您可以添加,说外部查询:选择ROW_NUMBER < = 10,它可以在你的情况下被用来限制在不超过10个职位。使用该用户的最大row_number来确定“读取全部10条评论”部分。

祝你好运!

0

这是查询的您正在寻找的骨架:

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条评论结合起来。只需更改列名称,它将工作:)