很多文章/新闻系统都回在详细页提供上下条记录的链接,但是传入详细页的参数又只有该记录的字段值,而没有上下记录字段值。所以我采用了union语句,结合limit巧妙的实现。

  假设表结构为article(id int(5),title char(20));详细页的链接地址是show.php?id=n

  最简单的方式,就是上一页的链接就是show.php?id=$id-1,下一页的链接就是show.php?id=$id+1,可是这种方法有很大的局限性,就是无法获取上下记录的相关信息,,比如title,而且如果是字段id的值并非连续(比如删除过记录等)。因此此法行不通。

  另外一种方式,就是将需要用到的上下记录相关信息,比如title和id都查询到一个数组中,然后获取当前id对应的数组下标,然后前后的数组元素值就是上下记录的id值/title值。这种方法可以实现,不过如果记录非常多,这样就会产生一个巨大的数组,不合适。

  这里,利用MySQL的联合查询的方式,在第二种方式的思路上改进一下,可以limit和where子句,分别限制筛选记录条数和筛选条件,从而可以分别筛选出指定id值的前两条记录和后一条记录,然后将两者联合,就得到了当前记录及其前后的三条记录。

  具体MySQL语句如下(假设查询上例子中的id=6的记录及其前后两条记录):

[code](select * from article where id=6 limit 2)[/code]

  这一段SQL语句中,第一部分查询结果就使id=6的上一条记录,第二部分查询结果就是id=6以及其后的记录,并且三条记录如此刚好按照id排序.从而达到了目的!

  所需注意的是,条件子句where、 order by、limit的顺序一定不能错,因为SQL查询的实质,就是先遍历记录,按照条件筛选,然后将筛选结果排序,再在排序的基础上用limit取范围,如果先用order by子句,就会默认将所有记录查询出来然后排序,where子句的作用就冲突了;同样,如果先用limit,则表明是用默认顺序排序后限制的范围,因此再用order by子句排序,就会在后面默认的添加上一个所有范围的子句,造成冲突。

  因此,必须[color=#0000FF]条件(where)先于排序(order by)先于范围(limit)[/color]