背景
应项目需要,需要在返回当前页信息时返回它的上一页和下一页信息的id,于是就有了这篇文章。
思路
通过主键id进行比较
方法一:
上一条:
select * from table_a where id = (select id from table_name where id < {$id} order by id desc limit 1);
下一条:
select * from table_a where id = (select id from table_name where id > {$id} order by id asc limit 1);
方法二:
上一条:
select * from table_name where id = (select max(id) from table_a where id < {$id});
下一条:
select * from table_name where id = (select min(id) from table_a where id > {$id});
很显然思路一句有很强的局限性,一旦数据有其他的排序条件,则起不了作用了,因此并不是通用的。
经过一上午的努力,想到了给数据编号的形式,如下:
正解
上一条:
SELECT
m.id
FROM
(
SELECT
( @i := @i + 1 ) AS RowNum,
A.*
FROM
table_name A,
( SELECT @i := 0 ) B
WHERE
具体条件
ORDER BY
具体排序方式
) m,
(
SELECT
D.id,D.RowNum as n2
FROM
(
SELECT
( @j := @j + 1 ) AS RowNum,
A.*
FROM
table_name A,
( SELECT @j := 0 ) B
WHERE
具体条件
ORDER BY
具体排序方式
) D
WHERE
D.id = 11
) q
WHERE
m.RowNum < q.n2
limit 1
SELECT
m.id
FROM
(
SELECT
( @i := @i + 1 ) AS RowNum,
A.*
FROM
table_name A,
( SELECT @i := 0 ) B
WHERE
具体条件
ORDER BY
具体排序方式
) m,
(
SELECT
D.id,D.RowNum as n2
FROM
(
SELECT
( @j := @j + 1 ) AS RowNum,
A.*
FROM
table_name A,
( SELECT @j := 0 ) B
WHERE
具体条件
ORDER BY
具体排序方式
) D
WHERE
D.id = 11
) q
WHERE
m.RowNum < q.n2
order by m.RowNum desc
limit 1
注意:
- table_name 改为自己的表名
- 具体条件和排序方式自己加上,而且条件和排序方式得是同一个
- 注意B表中需要重新定义变量j,不能在用i, 因为在同一个sql中i会继续增,导致出问题
- 查询下一条的sql需要加上order by m.RowNum desc ,因为取的是一条,要是没有逆序排的话,会找到最小的,当然也可以用Max函数。