gpt4 book ai didi

MySQL 'AS' 修改选择

转载 作者:行者123 更新时间:2023-11-29 07:18:32 24 4
gpt4 key购买 nike

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

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“日期”,但是为什么会改变选择呢?第一个为我提供给定边框后的预期第一个,第二个为我提供表中的最后一个。

可以请有人解释一下为什么会发生这种情况吗?

提前致谢,费雷尔。

最佳答案

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

documentation SELECT 语句的解释是:

A select_expr can be given an alias using AS alias_name. The alias is used as the expression's column name and can be used in GROUP BY, ORDER BY, or HAVING clauses.

...

MySQL resolves unqualified column or alias references in ORDER BY clauses by searching in the select_expr values, then in the columns of the tables in the FROM clause.

这基本上意味着别名比列名具有更高的优先级。

表中有一个名为date 的列。在第一个查询中,ORDER BY date 使用它进行排序,您将得到您期望的结果。

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

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

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

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

关于MySQL 'AS' 修改选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37012256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com