Я написал сложный SQL, который работает с MySQL ;-)основная идея:
- Заказать комментарии и добавить rownum в качестве ранга.комментарии к одному и тому же опросу сгенерировали ранги с непрерывными числами
- объединить максимальное агрегирование с последним комментарием для каждого запроса
- с помощью этой дополнительной информации можно создать предложение where для ограничения количества комментариев к опросу
Предварительное условие состоит в том, что комментарий с более новым date
имеет более высокое значение id
Обновление : изменен SQL.(реализовал несколько пропущенных тестовых примеров в моем небольшом наборе тестовых данных)Эта часть SQL позже используется дважды ... с этим вы должны создать View.
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
альтернатива, где пункт: 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