我写了一个复杂的 SQL 运行 MySQL ;-)
基本思路是:
- 对 cmets 进行排序并添加 rownum 作为排名。同一测验的 cmets 生成的排名具有连续的数字
- 使用每个测验的最新评论加入最大聚合
- 使用此附加信息,可以构建 where 子句来限制每次测验的 cmets
前提条件是date较新的评论具有较高的id
更新:更改了 SQL。 (在我的一小部分测试数据中发现了一些缺失的测试用例)
这部分 SQL 稍后会使用两次...您应该使用它创建一个视图。
SELECT
@rownum:=@rownum+1 AS Rank,
c.*
FROM _comments c, (SELECT @rownum:=0) r
ORDER BY c.q_id, c.id
-
SELECT
ranked_c.*
FROM (
SELECT
@rownum:=@rownum+1 AS Rank,
c.*
FROM _comments c, (SELECT @rownum:=0) r
ORDER BY c.q_id, c.id
) ranked_c
INNER JOIN (
SELECT
i.q_id,
MAX(i.Rank) AS LastEntry_id
FROM (
SELECT
@rownum:=@rownum+1 AS Rank,
c.*
FROM _comments c, (SELECT @rownum:=0) r
ORDER BY c.q_id, c.id
) i
GROUP BY i.q_id
) max_c ON ranked_c.q_id = max_c.q_id
WHERE max_c.LastEntry_id - ranked_c.Rank BETWEEN 0 AND 4
替代 where 子句:abs(max_c.LastEntry_id - ranked_c.Rank) < 5
--> 使用视图的解决方案:
CREATE OR REPLACE VIEW V_RankedComments AS (
SELECT
@rownum:=@rownum+1 AS Rank,
c.*
FROM _comments c, (SELECT @rownum:=0) r
ORDER BY c.q_id, c.id
)
SELECT
ranked_c.*
FROM V_RankedComments ranked_c
INNER JOIN (
SELECT
i.q_id,
MAX(i.Rank) AS LastEntry_id
FROM V_RankedComments i
GROUP BY i.q_id
) max_c ON ranked_c.q_id = max_c.q_id
WHERE max_c.LastEntry_id - ranked_c.Rank BETWEEN 0 AND 4