考虑Facebook。 Facebook显示任何状态的最新2条评论。我想做类似的事情。
我有一张桌子,例如status_id
,comment_id
,comment
和timestamp
。
现在我想为每个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
答案 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个以上的最新行。