MySQL按顺序选择结果

时间:2017-05-26 17:18:52

标签: mysql subquery sql-order-by

我想在order by子句之后使用子选择查询动态排序数据集。为了让自己熟悉这一点,我创建了一个小测试集并尝试了各种不起作用的东西。

要直接查看结果,我尝试通过按不存在的列排序来产生错误。这是我的查询和结果:

select * from entries order by 2 desc, (select case when (1=1) then 4 else 5 end);
select * from entries order by 2 desc, (select if(1=1,4,5));
+----+------+---------+------+
| id | name | content | time |
+----+------+---------+------+
| 19 | ccc  | ccc     |  300 |
| 18 | bbb  | bbb     |  200 |
| 17 | aaa  | aaa     |  100 |
| 20 | aaa  | aaa     |  400 |
| 21 | aaa  | aaa     |   50 |
+----+------+---------+------+

从1 = 1切换到1 = 2不会以任何方式改变结果。我预计错误1 = 2但没有发生任何事情。即使在这种形式下,两个查询都应该排在第4列,但他们不这样做。

我希望数据集按第四列排序,所以它看起来像这样:

+----+------+---------+------+
| id | name | content | time |
+----+------+---------+------+
| 19 | ccc  | ccc     |  300 |
| 18 | bbb  | bbb     |  200 |
| 21 | aaa  | aaa     |   50 |
| 17 | aaa  | aaa     |  100 |
| 20 | aaa  | aaa     |  400 |
+----+------+---------+------+

1 个答案:

答案 0 :(得分:1)

你真的不应该使用order by的位置语法 - 我甚至认为它在ANSI标准中已被弃用。整数 - 本身 - 表示按位置的列。但是,在带有数字的表达式中,值只是数字。

因此,请明确包含列名称:

order by name desc,
         (case when (1=1) then time else ?? end)

没有理由在select之前设置case