获取表格的最后两行,同时对其中一列进行分组。 MySQL的

时间:2012-05-03 22:24:38

标签: mysql sql group-by

考虑Facebook。 Facebook显示任何状态的最新2条评论。我想做类似的事情。

我有一张桌子,例如status_idcomment_idcommenttimestamp。 现在我想为每个status_id获取最新的2条评论。

目前我首先执行所有列中的GROUP_CONCAT,按status_id分组,然后将SUBSTRING_INDEX-2分开。

这会获取最新的2条评论,但status_id的所有记录的GROUP_CONCAT都是开销。

SELECT SUBSTRING_INDEX(GROUP_CONCAT('~', comment_id,
                                    '~', comment,
                                    '~', timestamp) 
                        SEPARATOR '|~|'), 
        '|~|', -2)
FROM commenttable
GROUP BY status_id;

你能用更好的方法帮助我吗?

我的表看起来像这样 -

status_id comment_id评论时间戳

1          1    xyz1     3 hour
1          2    xyz2     2 hour
1          3    xyz3     1 hour
2          4    xyz4     2 hour
2          6    xyz6     1 hour
3          5    xyz5     1 hour    

所以我希望输出为 -

1          2    xyz2     2 hour
1          3    xyz3     1 hour
2          4    xyz4     2 hour
2          6    xyz6     1 hour
3          5    xyz5     1 hour

2 个答案:

答案 0 :(得分:0)

这是我遇到的一个很好的答案here

select status_id, comment_id, comment, timestamp
from commenttable
where (
   select count(*) from commenttable as f
   where f.status_id = commenttable.status_id 
         and f.timestamp < commenttable.timestamp
) <= 2;

这不是非常有效(O(n ^ 2))但它比连接字符串和使用子字符串来隔离所需结果更有效。有人会说,恢复字符串操作而不是本机数据库索引会让你失去使用数据库的好处。

答案 1 :(得分:0)

经过一番努力,我找到了这个解决方案 -

以下给出了row_id -

  SELECT a.status_id, 
         a.comments_id, 
         COUNT(*) AS row_num 
  FROM comments a
       JOIN comments b 
       ON a.status_id = b.status_id AND a.comments_id >= b.comments_id
  GROUP BY a.status_id , a.comments_id
  ORDER BY row_num DESC

给我总行数 -

SELECT com.status_id, COUNT(*) total 
FROM comments com 
GROUP BY com.status_id

在主要选择的where子句中 -

row_num = total OR row_num = total - 1

这给出了最新的2行。您可以修改where子句以获取2个以上的最新行。