大家好,又见面了,我是你们的朋友全栈君。
先讲原理:
有上一篇下一篇(上一条 下一条),肯定是在:搜索条件下,排序规则固定的场景下,得到的一个查询集合(列表)中的一个效果。 1.我们在这两个条件(搜索条件where 排序规则order),给查询结果集给利用rownum(一个顺序自增的标号) 2.查询出目标uuid的rownum值x. 3.查询上一条和下一条: rownum = x-1的uuid 得到上一条 rownum = x 1的uuid 得到下一条
实际应用:
一个固定的检索条件 固定排序的查询:
代码语言:javascript复制SELECT
bn.*
FROM
base_notice bn
LEFT JOIN (
SELECT
GROUP_CONCAT(userinfo.STR_NAME) AS toUserNames,
GROUP_CONCAT(touser.STR_GUID) AS addresseeGuids,
GROUP_CONCAT(touser.STR_USER) AS touserIds,
GROUP_CONCAT(touser.is_read) AS isReads,
notice.STR_GUID AS noticeId
FROM
base_notice notice
LEFT JOIN base_notice_addressee touser ON touser.STR_NOTICE_GUID = notice.STR_GUID
LEFT JOIN base_user userinfo ON touser.str_user = userinfo.STR_GUID
WHERE
notice.STR_CREATE_USER_ID = '1367646365085077505'
AND notice.STR_TYPE = 2
AND (
touser.IS_DELETE = 0
AND touser.IS_ENABLE = 1
)
GROUP BY
notice.STR_GUID
) tempT1 ON bn.STR_GUID = tempT1.noticeId
WHERE
bn.IS_DELETE = 0
AND bn.IS_ENABLE = 1
AND bn.STR_CREATE_USER_ID = '1367646365085077505'
ORDER BY
bn.DT_GET_DATE DESC
增加rownum:(对比上面sql与下面sql 加入 –标记的操作) 说明:实际应用中通常获取上一条 下一条的uuid即可 这里我结果集 我增加了rowNum后,只查询了uuid 这个代码只观察标记位置的实际操作下面附上不带“–”的效果和结果:
代码语言:javascript复制-- SELECT
-- rownum AS rowNum,
-- STR_GUID AS strGuid
-- FROM
-- (
SELECT
-- @rownum :=@rownum 1 AS rownum,
bn.*
FROM
-- (SELECT @rownum := 0) r,
base_notice bn
LEFT JOIN (
SELECT
GROUP_CONCAT(userinfo.STR_NAME) AS toUserNames,
GROUP_CONCAT(touser.STR_GUID) AS addresseeGuids,
GROUP_CONCAT(touser.STR_USER) AS touserIds,
GROUP_CONCAT(touser.is_read) AS isReads,
notice.STR_GUID AS noticeId
FROM
base_notice notice
LEFT JOIN base_notice_addressee touser ON touser.STR_NOTICE_GUID = notice.STR_GUID
LEFT JOIN base_user userinfo ON touser.str_user = userinfo.STR_GUID
WHERE
notice.STR_CREATE_USER_ID = '1367646365085077505'
AND notice.STR_TYPE = 2
AND (
touser.IS_DELETE = 0
AND touser.IS_ENABLE = 1
)
GROUP BY
notice.STR_GUID
) tempT1 ON bn.STR_GUID = tempT1.noticeId
WHERE
bn.IS_DELETE = 0
AND bn.IS_ENABLE = 1
AND bn.STR_CREATE_USER_ID = '1367646365085077505'
ORDER BY
bn.DT_GET_DATE DESC
-- ) tempT
代码语言:javascript复制 SELECT
rownum AS rowNum,
STR_GUID AS strGuid
FROM
(
SELECT
@rownum :=@rownum 1 AS rownum,
bn.*
FROM
(SELECT @rownum := 0) r,
base_notice bn
LEFT JOIN (
SELECT
GROUP_CONCAT(userinfo.STR_NAME) AS toUserNames,
GROUP_CONCAT(touser.STR_GUID) AS addresseeGuids,
GROUP_CONCAT(touser.STR_USER) AS touserIds,
GROUP_CONCAT(touser.is_read) AS isReads,
notice.STR_GUID AS noticeId
FROM
base_notice notice
LEFT JOIN base_notice_addressee touser ON touser.STR_NOTICE_GUID = notice.STR_GUID
LEFT JOIN base_user userinfo ON touser.str_user = userinfo.STR_GUID
WHERE
notice.STR_CREATE_USER_ID = '1367646365085077505'
AND notice.STR_TYPE = 2
AND (
touser.IS_DELETE = 0
AND touser.IS_ENABLE = 1
)
GROUP BY
notice.STR_GUID
) tempT1 ON bn.STR_GUID = tempT1.noticeId
WHERE
bn.IS_DELETE = 0
AND bn.IS_ENABLE = 1
AND bn.STR_CREATE_USER_ID = '1367646365085077505'
ORDER BY
bn.DT_GET_DATE DESC
) tempT
然后假设我们需要查询uuid =“100” 的上一条和下一条,只需要在上面sql后面增加 where条件查询 where strGuid=’100’的rowNum值。
代码语言:javascript复制 where tempT.STR_GUID='100'
我们看到 strGuid=‘100’ 他的rownum=2 很容易,我们知道他的上一条rowNum=1 下一条rowNum=3 于是 我们修改上面sql语句的条件
代码语言:javascript复制 where rownum in (1,3);
从结果集中我们看出了:上一条uuid 下一条uui都有了
当前被查的uuid的rownum=1 即:第一条的结果集
代码语言:javascript复制where rownum in (0,2);
当前被查的uuid的rownum=3 即:最后一条的结果集
代码语言:javascript复制where rownum in (2,4);
第一条和最后一条怎么辨别?
我们利用查询条件 当前被查的uuid rownum=x 得到结果集 rownum= x-1 strGuid非null 即:上一条有值 得到结果集 rownum= x 1 strGuid非null 即:下一条有值 上一条 null 下一条非null :当前为第一条 上一条 非null 下一条非null :非头条和末条的中间中的一条 上一条 非null 下一条null :当前为最后一条 上一条null 下一条null:非当前条件内的查询记录。
上一条uuid | 下一条uuid | 当前被查询uuid结论 |
---|---|---|
null | 非null | 第一条 |
非null | 非null | 非头条和末条的中间中的一条 |
非null | null | 最后一条 |
null | null | :非当前条件内的查询记录 |
以上。你学废了吗!?
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169242.html原文链接:https://javaforall.cn