MySQL'AS'修改选择

时间:2016-05-03 18:56:03

标签: mysql sql

好的,我输了,我不知道为什么这两个查询都有不同的输出。

The table looks something like this:
+------------+--------+--------+
|    date    | kills  | deaths |
+------------+--------+--------+
| 2016-05-03 | 123456 | 123456 |
+------------+--------+--------+

SELECT SUBDATE(CURRENT_DATE(),30), `kills`, `deaths` 
    FROM `bf4c_1558544842`
    WHERE `date` <= SUBDATE(CURRENT_DATE(),30) 
    ORDER BY `date` DESC 
    LIMIT 1

SELECT SUBDATE(CURRENT_DATE(),30) AS "date", `kills`, `deaths` 
    FROM `bf4c_1558544842`
    WHERE `date` <= SUBDATE(CURRENT_DATE(),30) 
    ORDER BY `date` DESC 
    LIMIT 1

唯一的区别是AS "date",但为什么会改变选择? 第一个让我在给定的边界之后首先获得预期的第一个,第二个给我表中的最后一个。

可以请某人解释我为什么会这样吗?

提前致谢,Feirell。

1 个答案:

答案 0 :(得分:2)

在第二个查询中,表达式SUBDATE(CURRENT_DATE(),30)的别名为date。稍后,所选行为ORDER BY date,排序后仅返回第一行。

SELECT声明的documentation解释了:

  

可以使用select_expr alias_name AS提供别名。别名用作表达式的列名称,可以在GROUP BYORDER BYHAVING子句中使用。

     

...

     

MySQL通过搜索 select_expr 值,然后在{{1}的表格列中搜索ORDER BY子句中的非限定列或别名引用}。clause。

这基本上意味着别名的优先级高于列名。

表格中有一个名为FROM的列。在第一个查询中,date使用它进行排序,您可以获得预期的结果。

在第二个查询中,ORDER BY date子句使用date别名。但由于它为常量表达式SORT BY date添加了别名,因此所有选定的行都具有SUBDATE(CURRENT_DATE(),30)表达式的相同值。无论订单如何,它们都已经分类。在这种情况下,任何结果都是可能的。

编辑: 一个解决方案是在order by子句中的date前面添加表名,如下所示:

date

这样,解释器就知道该列不是新的别名。