我有一个存储过程,我在其中创建了一个临时表,如下所示:
CREATE TEMPORARY TABLE order_report_temp
( spid INT(10) UNSIGNED,
sp_title VARCHAR(255),
pmnt_title VARCHAR(255),
pmnt_period VARCHAR(20),
kay_id INT(10) UNSIGNED,
kay_title VARCHAR(255),
kay_description VARCHAR(255),
kad VARCHAR(255),
kay_amount FLOAT,
wo_code VARCHAR(50),
cost_center VARCHAR(255),
sp_place VARCHAR(255),
wo_type INT(2)
) DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci;
我在该表中插入数据,最后我做了:
SELECT * FROM order_report_temp ORDER BY spid, kay_id, wo_type;
在我得到的数据表中,我有:
spid------kay_id
29248.....1475 (ETC....)
29248.....1475 (ETC....)
29256.....1475 (ETC....)
29248.....1476 (ETC....)
29248.....1476 (ETC....)
29256.....1476 (ETC....)
正确的结果是:
spid------kay_id
29248.....1475 (ETC....)
29248.....1475 (ETC....)
29248.....1476 (ETC....)
29248.....1476 (ETC....)
29256.....1475 (ETC....)
29256.....1476 (ETC....)
尽管 spid 在 ORDER BY 语句中是第一个,但它似乎优先考虑 kay_id 列而不是 spid 列。或者它完全忽略了spid。
spid 不是 VARCHAR 所以这种行为不应该发生。
有任何想法吗?这是一个已知的错误还是什么?
我的 MySQL 版本是 5.0.10
最佳答案
就像我在上面的评论中所说的那样,我发现了我的(愚蠢的)错误。我认为更多的人可能会遇到同样的问题,这里有一个教训要教,所以我发布了解决方案:
我已经声明了一个名为 spid 的变量,我在程序开始时使用了它,这是我没有使用表别名的唯一查询,因此 mySQL 使用该变量进行排序,而不是我想我想要的列。
所以我用这个替换了选择查询:
SELECT tmp.* FROM order_report_temp tmp ORDER BY tmp.spid, tmp.kay_id, tmp.wo_type;
自我注意: 在存储过程查询中始终为您的表使用别名
或者正如eggyal指出的那样,我应该为我的局部变量使用前缀,以避免它们与列具有相同的名称。
关于MySQL错误的排序顺序 - 忽略第一列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20805508/