0

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

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

目前我首先做GROUP_CONCAT所有列中的一个,分组status_id,然后使用SUBSTRING_INDEXwith -2

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

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
4

2 回答 2

0

这是我在这里遇到的一个很好的答案:

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)),但它比连接字符串和使用子字符串来隔离您想要的结果要有效得多。有人会说,恢复到字符串操作而不是本地数据库索引会首先剥夺您使用数据库的好处。

于 2012-05-03T22:40:31.097 回答
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 个最新的行。

于 2012-05-20T09:33:01.710 回答