Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql游标未按正确顺序排序结果_Mysql_Stored Procedures_Cursor_Sql Order By - Fatal编程技术网

Mysql游标未按正确顺序排序结果

Mysql游标未按正确顺序排序结果,mysql,stored-procedures,cursor,sql-order-by,Mysql,Stored Procedures,Cursor,Sql Order By,这是我的原始代码的一个抽象,因为这对你们来说更容易阅读 我不熟悉Mysql存储过程和游标 当我在查询上设置ORDER BY指令时,游标没有将结果正确排序 以下是表的所有结构和数据,用于重现问题 日志表: DROP TABLE IF EXISTS `log`; CREATE TABLE `log` ( `key` text NOT NULL, `value` text NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=

这是我的原始代码的一个抽象,因为这对你们来说更容易阅读

我不熟悉Mysql存储过程和游标

当我在查询上设置ORDER BY指令时,游标没有将结果正确排序

以下是表的所有结构和数据,用于重现问题

日志表:

    DROP TABLE IF EXISTS `log`;
    CREATE TABLE `log` (
      `key` text NOT NULL,
      `value` text NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
测试表:

    DROP TABLE IF EXISTS `test1`;
    CREATE TABLE `test1` (
      `ID` bigint(8) unsigned NOT NULL AUTO_INCREMENT,
      `price` float(16,8) NOT NULL,
      PRIMARY KEY (`ID`),
      KEY `price` (`price`)
    ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=latin1;
测试表数据:

    INSERT INTO `test1` (`price`)
    VALUES (100),(200),(300),(400),(300),(200),(100);
查询:

    SELECT *
    FROM `test1`
    ORDER BY price DESC;
直接使用查询可以获得预期的结果:

  • 4-400.00000000
  • 5-300.00000000
  • 3-300.00000000
  • 6-200.00000000
  • 2-200.00000000
  • 7-100.00000000
  • 1-100.00000000
存储过程

    DROP PROCEDURE IF EXISTS `test_proc1`;
    DELIMITER ;;

    CREATE DEFINER=`root`@`localhost` PROCEDURE `test_proc1`()
    BEGIN

      DECLARE done INT DEFAULT 0;
      DECLARE ID BIGINT(8);
      DECLARE price FLOAT(16,8);

      DECLARE cur1 CURSOR FOR
      SELECT * FROM `test1` ORDER BY price DESC; #Exact Query

      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

      START TRANSACTION;
        OPEN cur1;
        #Cleaning log
        TRUNCATE `log`;
        read_loop:
        LOOP
          FETCH cur1 INTO ID,price;
          IF done = 1 THEN
            LEAVE read_loop;
          END IF;
          #Inserting data to log
          INSERT INTO `log`
          VALUES (ID,price);
        END LOOP read_loop;

        CLOSE cur1;
      COMMIT;

    #Bring log for result
    SELECT * FROM log;

    END;;
    DELIMITER ;
呼叫程序

    CALL test_proc1();
游标的查询与我在顶部发布的查询完全相同,您可以在存储过程中检查它。但当我循环通过它时,我得到了另一个订单

  • 15100000000
  • 21100000000
  • 16200000000
  • 02000000000
  • 17300000000
  • 19300000000
  • 18400000000
发生什么事了?有人能帮我吗? 我也尝试过这样嵌套查询,但没有任何修复

SELECT * FROM(
SELECT *
FROM `test1`
ORDER BY price DESC) AS tmp_tbl
看起来您遇到了“可变冲突”。使用变量
price
代替具有确切名称的表列。更改变量名,或使用如下表别名:

SELECT * FROM `test1` as `t` ORDER BY `t`.`price` DESC;

也许你是对的,这真的很有效。非常感谢你的帮助。