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错误的排序顺序 - 忽略第一列的主要内容,如果未能解决你的问题,请参考以下文章

忽略插入错误

mysql分组后,取每组的前3条数据(并且有顺序)

MySQL排序:SELECT ORDER BY

Mysql查询之 指定顺序排序

mysql 重新整理——索引简介[七]

mysql 重新整理——索引简介[七]