如果我使用这个SQL,我会得到这样的记录:
SELECT * FROM news WHERE
ID TITLE
---- -------
23 title 1
25 title 2
31 title 3
38 title 4
43 title 5
.... ....
178 title 69
189 title 70
如果我使用分页,我的SQL就是这样:
SELECT *,
COUNT(*) OVER () AS Total,
ROW_NUMBER() OVER (ORDER BY news_date DESC, news_id DESC) AS Position
FROM news
ORDER BY news_date DESC, news_id DESC
OFFSET 5 ROW FETCH NEXT 5 ROWS ONLY;
ID TITLE TOTAL POSITION
---- ------- ------- ----------
45 title 6 70 #6
46 title 7 70 #7
48 title 8 70 #8
51 title 9 70 #9
54 title 10 70 #10
现在,我将获得前3个和后3个值,并获得#27(例如)#27 + 3 AND#27-3,因为我的ID是“127”(#27位置) 。 我可以制作一个部分SQL:
WITH NewsSql AS (
SELECT
*,
COUNT(*) OVER () AS Total,
ROW_NUMBER() OVER (ORDER BY new_date DESC,new_id DESC) AS Position
FROM news
)SELECT * FROM NewsSql
WHERE Position<=3 OR Position>=Total-2 OR news_id=127
ID TITLE TOTAL POSITION
---- ------- ------- ----------
23 title 1 70 #1
25 title 2 70 #2
31 title 3 70 #3
127 title 27 70 #27
175 title 68 70 #68
178 title 69 70 #69
189 title 70 70 #70
如何在#24和#30之间添加位置记录?
PD:抱歉我的英文
答案 0 :(得分:0)
我用这个SQL解决了这个问题:
WITH NewsSql AS (
SELECT
*,
COUNT(*) OVER () AS Total,
ROW_NUMBER() OVER (ORDER BY news_date DESC,news_id DESC) AS Position,
(
SELECT Pos
FROM (
SELECT
news_id AS NewsID,
news_title,
ROW_NUMBER() OVER (ORDER BY news_date DESC,news_id DESC) AS Pos
FROM news
) news_pos
WHERE news_pos.NewsID= <ID_input>
) AS Actual
FROM news
)
SELECT * FROM NewsSql
WHERE
Position<=3 OR
Position>=Total-2 OR
news_id=127 OR
Position BETWEEN Actual-5 AND Actual+5