好的,我输了,我不知道为什么这两个查询都有不同的输出。
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。
答案 0 :(得分:2)
在第二个查询中,表达式SUBDATE(CURRENT_DATE(),30)
的别名为date
。稍后,所选行为ORDER BY date
,排序后仅返回第一行。
SELECT
声明的documentation解释了:
可以使用
select_expr
alias_name 为AS
提供别名。别名用作表达式的列名称,可以在GROUP BY
,ORDER BY
或HAVING
子句中使用。...
MySQL通过搜索 select_expr 值,然后在{{1}的表格列中搜索
ORDER BY
子句中的非限定列或别名引用}。clause。
这基本上意味着别名的优先级高于列名。
表格中有一个名为FROM
的列。在第一个查询中,date
使用它进行排序,您可以获得预期的结果。
在第二个查询中,ORDER BY date
子句使用date
别名。但由于它为常量表达式SORT BY date
添加了别名,因此所有选定的行都具有SUBDATE(CURRENT_DATE(),30)
表达式的相同值。无论订单如何,它们都已经分类。在这种情况下,任何结果都是可能的。
编辑:
一个解决方案是在order by子句中的date
前面添加表名,如下所示:
date
这样,解释器就知道该列不是新的别名。