MySQL存储过程临时表 - ORDER BY varchar字段未排序

时间:2016-03-07 21:46:19

标签: mysql database sorting stored-procedures temp-tables

我已经尝试过为此寻找答案,但一直没有成功。

我有一个创建临时表的MySQL 5.6存储过程。在临时表中是一个varchar(50)字段。

我将数据插入到我的存储过程中的临时表中,然后通过一个简单的选择返回它,如下所示:

SELECT * FROM tmp_table ORDER BY a ASC, b ASC;

...其中“b”是varchar字段。 “a”是日期时间字段。

日期时间排序很好,但即使我删除了初始排序,我仍然没有按列b进行正确的排序。

我已尝试在字段和表格上设置整理类型,字符集等。

我做错了什么吗?任何帮助将不胜感激。

提前致谢。

编辑回应评论

SHOW CREATE TABLE ...返回:

CREATE TEMPORARY TABLE `tmp_table` (  
  `d_date` datetime DEFAULT NULL,  
  `d_type_id` int(11) DEFAULT NULL,  
  `d_type_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,  
  `d_value` decimal(6,3) DEFAULT NULL  
) ENGINE=InnoDB DEFAULT CHARSET=latin1  

显示完整列...返回:

+------------------+--------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
| Field            | Type         | Collation          | Null | Key | Default | Extra | Privileges                      | Comment |
+------------------+--------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
| d_date           | datetime     | NULL               | YES  |     | NULL    |       | select,insert,update,references |         |
| d_type_id        | int(11)      | NULL               | YES  |     | NULL    |       | select,insert,update,references |         |
| d_type_name      | varchar(50)  | utf8mb4_unicode_ci | YES  |     | NULL    |       | select,insert,update,references |         |
| d_value          | decimal(6,3) | NULL               | YES  |     | NULL    |       | select,insert,update,references |         |
+------------------+--------------+--------------------+------+-----+---------+-------+---------------------------------+---------+

当我调用存储过程时,我首先按“d_date”排序(这是上面查询中的“a”列),然后是“d_type_name”(上面的“b”列)。我实际上通过“d_value”进行第三次排序,但即使我只按“d_type_name”排序,我仍然没有得到预期的排序结果。

这就是我所期待的:

+---------------------+----------------+------------------+-----------+
| d_date              | d_type_id      | d_type_name      | d_value   |
+---------------------+----------------+------------------+-----------+
| 2016-02-28 00:00:00 |              1 | B                |     0.000 |
| 2016-02-28 00:00:00 |              3 | E                |     0.000 |
| 2016-02-28 00:00:00 |              2 | O                |     0.000 |
| 2016-02-28 00:00:00 |              4 | P                |     0.000 |
| 2016-02-29 00:00:00 |              1 | B                |     0.000 |
| 2016-02-29 00:00:00 |              3 | E                |     0.000 |
| 2016-02-29 00:00:00 |              2 | O                |     0.000 |
| 2016-02-29 00:00:00 |              4 | P                |     4.800 |
| 2016-03-01 00:00:00 |              1 | B                |     0.000 |
| 2016-03-01 00:00:00 |              3 | E                |     0.200 |
| 2016-03-01 00:00:00 |              2 | O                |     0.000 |
| 2016-03-01 00:00:00 |              4 | P                |     4.200 |
| 2016-03-02 00:00:00 |              1 | B                |     0.500 |
| 2016-03-02 00:00:00 |              3 | E                |     1.250 |
| 2016-03-02 00:00:00 |              2 | O                |     0.000 |
| 2016-03-02 00:00:00 |              4 | P                |     2.000 |
+---------------------+----------------+------------------+-----------+

这就是我得到的:

+---------------------+----------------+------------------+-----------+
| d_date              | d_type_id      | d_type_name      | d_value   |
+---------------------+----------------+------------------+-----------+
| 2016-02-28 00:00:00 |              4 | P                |     0.000 |
| 2016-02-28 00:00:00 |              3 | E                |     0.000 |
| 2016-02-28 00:00:00 |              2 | O                |     0.000 |
| 2016-02-28 00:00:00 |              1 | B                |     0.000 |
| 2016-02-29 00:00:00 |              4 | P                |     4.800 |
| 2016-02-29 00:00:00 |              3 | E                |     0.000 |
| 2016-02-29 00:00:00 |              2 | O                |     0.000 |
| 2016-02-29 00:00:00 |              1 | B                |     0.000 |
| 2016-03-01 00:00:00 |              4 | P                |     4.200 |
| 2016-03-01 00:00:00 |              1 | B                |     0.200 |
| 2016-03-01 00:00:00 |              3 | E                |     0.000 |
| 2016-03-01 00:00:00 |              2 | O                |     0.000 |
| 2016-03-02 00:00:00 |              4 | P                |     2.000 |
| 2016-03-02 00:00:00 |              3 | E                |     1.250 |
| 2016-03-02 00:00:00 |              1 | B                |     0.500 |
| 2016-03-02 00:00:00 |              2 | O                |     0.000 |
+---------------------+----------------+------------------+-----------+

这还够吗?我真的希望我错过了一些非常明显的事情(天气已经好几天,所以你永远都不知道)。再次感谢。

0 个答案:

没有答案