MySQL错误的排序顺序 - 忽略第一列
Posted
技术标签:
【中文标题】MySQL错误的排序顺序 - 忽略第一列【英文标题】:MySQL wrong sort order - Ignoring first column 【发布时间】:2013-12-27 18:00:37 【问题描述】:我有一个存储过程,我在其中创建了一个临时表,如下所示:
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....)
它似乎将 kay_id 列优先于 spid 列,即使 spid 在 ORDER BY 语句中是第一个。或者它完全忽略了 spid。 spid 不是 VARCHAR 所以这种行为不应该发生。 有任何想法吗?这是一个已知的错误还是什么?
我的 mysql 版本是 5.0.10
【问题讨论】:
要么 MySQL 喝醉了(经常发生),要么你做错了什么(这个)。如果是int
,它将正确排序。你在非临时表上试过这个吗?
在这里实现:sqlfiddle.com/#!2/b6971/2 我们可以帮助您:p
伙计们,我已经折磨自己一个多小时了,现在我觉得自己像个智障。我已经声明了一个名为 spid 的变量,我在程序开始时使用了它,这是我没有为表使用别名的唯一查询,所以我猜 mySQL 使用该变量进行排序。这里有一个教训:在存储过程查询中始终为您的表使用别名。
@PanagiotisPalladinos:如Local Variable Scope and Resolution 下所述,“局部变量不应与表列同名。如果 SQL 语句(例如 SELECT ... INTO
语句)包含对列的引用和同名声明的局部变量,MySQL 当前将引用解释为变量的名称。“我倾向于在变量和 sproc 参数前加上下划线以避免这种混淆。
【参考方案1】:
就像我在上面的评论中所说的那样,我发现了我的(愚蠢的)错误。我认为更多的人可能会偶然发现同样的问题,这里有一个教训要教,所以我发布了解决方案:
我已经声明了一个名为 spid 的变量,我在程序开始时使用了它,这是唯一一个我没有为表使用别名的查询,所以 mySQL 使用该变量进行排序,而不是我想我想要的列.
所以我用这个替换了选择查询:
SELECT tmp.* FROM order_report_temp tmp ORDER BY tmp.spid, tmp.kay_id, tmp.wo_type;
自我说明:在存储过程查询中始终为您的表使用别名 或者正如 eggyal 指出的那样,我应该为我的局部变量使用前缀,以避免它们与列同名。
【讨论】:
以上是关于MySQL错误的排序顺序 - 忽略第一列的主要内容,如果未能解决你的问题,请参考以下文章