V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
b7898585
V2EX  ›  MySQL

求教个 mysql 的语句

  •  
  •   b7898585 · 2016-06-02 23:24:22 +08:00 · 1907 次点击
    这是一个创建于 3095 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在表 A 中有 3 个字段, ID, BOOKID, ORDERID
    ID 是自动编号的, BOOKID 是小说明, ORDERID 是小说章节排序的
    想要 在相同的 BOOKID 下,根据 ID 的大小,自动的重新赋值 ORDERID ,从 1 开始
    谁写过这样的 mysql 语句?
    1 条回复    2016-06-09 13:30:47 +08:00
    fangjinmin
        1
    fangjinmin  
       2016-06-09 13:30:47 +08:00
    可以做一个 procedure 来做这个事情。


    ====================================================================
    DELIMITER;;

    DROP PROCEDURE IF EXISTS `update_a_orderid`;
    CREATE PROCEDURE update_a_orderid ()
    BEGIN
    DECLARE a_id, a_bookid, a_orderid, prev_bookid INT UNSIGNED;
    DECLARE done INT DEFAULT FALSE;
    DECLARE cur1 CURSOR FOR (SELECT ID, BOOKID from A ORDER BY BOOKID);
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    SET a_orderid=1;
    SET prev_bookid=0;
    OPEN cur1;
    read_loop: LOOP
    FETCH cur1 INTO a_id, a_bookid;
    IF done THEN
    LEAVE read_loop;
    END IF;
    IF prev_bookid = 0 OR a_bookid > prev_bookid THEN
    SET a_orderid = 1;
    ELSE
    SET a_orderid = a_orderid + 1;
    END IF;
    UPDATE A set orderid=a_orderid where id=a_id;
    END LOOP;

    CLOSE cur1;
    END
    ;;

    DELIMITER ;

    ====================================================================

    最后调用 call update_a_orderid();就可以了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2582 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:50 · PVG 12:50 · LAX 20:50 · JFK 23:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.