使用CASE表达式在MySQL中排序显示我不理解的结果

时间:2015-09-03 08:00:25

标签: mysql sql sorting

我正在建立一个小程序,允许教师从一系列问题中创建考试。然后,教师可以按照他/她希望他们出现在考试中的顺序对问题进行排序。

所以我试图根据记录ID的顺序返回一个问题列表。

SELECT * FROM ExamQuestion WHERE ElementID = 66

返回以下结果......

2505
2506
2615
2616
2617

如果我尝试根据教师使用下面的查询设置的问题顺序对这些结果进行排序......

SELECT * FROM ExamQuestion WHERE ElementID = 66 ORDER BY 
CASE 
    WHEN ID = '2616' THEN '1'
    WHEN ID = '2615' THEN '2'
    WHEN ID = '2617' THEN '3'
    WHEN ID = '2505' THEN '4'
    ELSE ID END ASC

我得到以下结果

2616
2615
2506
2617
2505

这几乎是完美的,但我无法解决的是为什么2506在2617之前被返回,即使它是明确设置的。

通常在这个查询中我不会有完整的ID列表,它会根据老师想要在考试中提出的问题而有所不同......

我原以为2506应该出现在列表的最后......

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

以下是您的CASE声明:

CASE 
    WHEN ID = '2616' THEN '1'
    WHEN ID = '2615' THEN '2'
    WHEN ID = '2617' THEN '3'
    WHEN ID = '2505' THEN '4'
    ELSE ID END ASC

'2506'属于ELSE条件,它将按ID值本身排序。在这种情况下,值为'2506',它位于字符串'2''3'之间。

接下来是您的结果集,我列出了实际用于对结果进行排序的值:

+------+------------+
|  ID  | Sort Value |
+------+------------+
| 2616 |   '1'      |
| 2615 |   '2'      |
| 2506 |   '2506'   |    <-- '2506' is in between '2' and '3'
| 2617 |   '3'      |
| 2505 |   '4'      |
+------+------------+

答案 1 :(得分:0)

谢谢你们 - 你们都被发现......订单确实是一个字符串。如果我将CASE语句的THEN部分转换为数字(删除数字周围的引号),那么它就像我期望的那样工作

SELECT * FROM MightyMindsExamQuestion WHERE IFElementID = 66 ORDER BY 
CASE 
    WHEN ID = '2616' THEN 1
    WHEN ID = '2615' THEN 2
    WHEN ID = '2617' THEN 3
    WHEN ID = '2505' THEN 4
ELSE ID END ASC

结果

2616
2615
2617
2505
2506

感谢您的帮助......