我已经尝试过为此寻找答案,但一直没有成功。
我有一个创建临时表的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 |
+---------------------+----------------+------------------+-----------+
这还够吗?我真的希望我错过了一些非常明显的事情(天气已经好几天,所以你永远都不知道)。再次感谢。