我想实现的功能很简单
例如表A
有字段id,a,b
里面有3条数据
id   a      b
1    求     助
2    一     个
3    存储   过程当我使用 select * from A where id=2 
除了要返回  “2”    “一”     “个”  
还要返回    “1”    “求”     
还要返回    “3”    “存储”    即返回当前搜索数据的上一条和下一条。
我用的是 mysql 5.0

解决方案 »

  1.   

    上一条,下一条的确比较恶心!!1、如果你的ID字段是连续的,很简单。直接 select * from A where id in (2-1,2,2+1);2、如果你的ID字段不是连续的,那就有点复杂了。
    写个存储过程来找最近的记录!!也就是说要找到ID=2之前有多少条记录。
    比如:select count(*) into @cnt from A where id < 2;set @stmt = concat('select * from A where limit ',@cnt-1,',3');
    prepare s1 from @stmt;
    execute s1;
    drop prepare s1;
    set @stmt = @cnt = NULL;
      

  2.   

    上一条和下一条。:什么标准,ID OR 自然顺序?
      

  3.   

    本人对存储过程没有一点了解
    能写个完整SQL语句给我吗,谢谢了
    CREATE TABLE `a` (
      `id` int(4) NOT NULL auto_increment,
      `a` varchar(4) collate utf8_bin NOT NULL default 'o',
      `b` varchar(4) collate utf8_bin NOT NULL default 'o',
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=4 ;INSERT INTO `a` VALUES (1, 'o', 'o');
    INSERT INTO `a` VALUES (2, 'o', 'o');
    INSERT INTO `a` VALUES (3, 'o', 'o');
      

  4.   


    找不到了。我给你写一个吧。create table id ( id int not null auto_increment primary key);
    insert id values (NULL);
    插入数据过程。
    ....第一种情况select * from id where id in (2-1,2,2+1);
    query result
    id 


    3 第二种情况。
    我们干条数据。
    delete from id where id >2 limit 4;
    表里数据:
    query result
    id 



    63 
    64现在要得到上一条和下一条,看这个SPROC.delimiter ||
    create procedure sp_get_id(IN f_id int)
    begin
      select count(*) into @cnt from id where id < f_id; 
      set @stmt = concat('select * from id limit ',@cnt-1,',3'); 
      prepare s1 from @stmt; 
      execute s1; 
      drop prepare s1; 
      set @stmt = @cnt = NULL;
    end||
    delimiter ;调用存储过程
    call sp_get_id(2);
    query result
    id 


    7 你可以传你需要的值进去。
      

  5.   

    谢谢yueliangdao0608!问题已解决。我还有一道
    不知道有没时间帮我解决,我给你加分!有一个存储图片的表a
    字段有3个:
    id(自加一主键)
    name
    url
    我想实现的是
    当插入数据时url以id+".jpg"来保存。
    请问怎么实现?
      

  6.   


    如果truncate table 后,这个last_insert_id()不能立即还原。
    因此用触发器会出现问题。最好的办法就是在程序端处理,保留ID,然后就可以在插入的时候进行显式的组合了。
      

  7.   

    如果你不用自增的话可以这样实现:
    假设表名tb_urlDELIMITER $$CREATE
        TRIGGER `tr_test` BEFORE INSERT
        ON `tb_url`
        FOR EACH ROW BEGIN
          flush tables;
          set NEW.url = concat(NEW.id,'.jpg');
        END$$DELIMITER ;
    否则就隔上一段时间UPDATE一下表吧。
    update tb_url set url = concat(id,'.jpg');
      

  8.   

    这么说只能
    先 insert 再 select id 最后 update set(url)3步?
    我现在就是这样做的,感觉3次操作数据库太繁琐了。
      

  9.   

    你所说的用自增字段是什么意思啊?
    是先 insert 再 select id 最后 update set(url)3步? 
    还是其他?
    说明白点  
    谢谢
      

  10.   

    你所说的用自增字段是什么意思啊? 就是AUTO_INCREMENT 类型,
    第一个问题也可以用
    select id from lsb1 where id<2 order by id desc limit 1
    union
    select id from tt where id=2
    union
    select id from tt where id>2 order by id asc limit 1
      

  11.   

    前提是ID是有话中有话顺序且小->大的顺序
      

  12.   

    原来还有这个方法,确实实用。
    关于那个图片的表我用的就是AUTO_INCREMENT
    如果不能用存储过程就用union好了
      

  13.   

    如果是网络上用last_insert_id()是最好的
      

  14.   

    确实,ORDER BY 比较慢,如果记录多的话,速度有影响,而且要有
    从小->大的顺序