我有一个存储过程,我按如下方式创建一个临时表:
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语句中是第一个,它似乎也优先考虑了spid的kay_id列。或者它完全忽略了spid。 spid不是VARCHAR所以不应该发生这种行为。 有任何想法吗?这是一个已知的bug还是什么?
我的mySQL版本是5.0.10
答案 0 :(得分:0)
就像我在上面的评论中所说,我发现了我的(愚蠢)错误。我认为更多的人可能会遇到同样的问题,这里有一个教训,所以我发布了解决方案:
我已经声明了一个名为spid的变量,我在程序的开头使用了这个,这是我没有使用表的别名的唯一查询,所以mySQL使用变量进行排序而不是我想要的列我猜
所以我用这个替换了选择查询:
SELECT tmp.* FROM order_report_temp tmp ORDER BY tmp.spid, tmp.kay_id, tmp.wo_type;
自我注意:在已存储的程序查询中始终为您的表格使用别名 或者像eggyal指出的那样,我应该为我的局部变量使用前缀,以避免它们与列具有相同的名称。