gpt4 book ai didi

mysql - 不能在 mysql 函数中使用别名作为 ORDER BY 子句的一部分

转载 作者:可可西里 更新时间:2023-11-01 08:05:41 26 4
gpt4 key购买 nike

如果我执行以下查询,它工作正常。

SELECT 
CASE WHEN description LIKE '%a%' THEN 'A'
WHEN description LIKE '%b%' THEN 'B'
ELSE 'C'
END AS foo
,COUNT(*) AS cnt
FROM product p
GROUP BY foo
ORDER BY foo;

结果是这样的

foo  |  cnt
-----------
A | 809
B | 29
C | 55

但是,下面的查询给出了一个错误。请注意,我只更改了最后一行。

SELECT 
CASE WHEN description LIKE '%a%' THEN 'A'
WHEN description LIKE '%b%' THEN 'B'
ELSE 'C'
END AS foo
,COUNT(*) AS cnt
FROM product p
GROUP BY foo
ORDER BY FIELD(foo, 'A', 'B', 'C'); -- Different line

SQL Error (1054): Unknown column 'foo' in 'order clause'

这是为什么?

我正在使用 MySQL 版本 5.0.22

更新:

只是为了扩展,如果我省略分组,我会看到相同的行为,即:

SELECT 
CASE WHEN description LIKE '%a%' THEN 'A'
WHEN description LIKE '%b%' THEN 'B'
ELSE 'C'
END AS foo
FROM product p
ORDER BY foo;

(运行良好)

对比

SELECT 
CASE WHEN description LIKE '%a%' THEN 'A'
WHEN description LIKE '%b%' THEN 'B'
ELSE 'C'
END AS foo
FROM product p
ORDER BY FIELD(foo, 'A', 'B', 'C'); -- Different line

(错误)

最佳答案

之所以会出现这种情况,是因为MySQL在早期版本(显然包括5.0)中是这样处理ORDER BY的:

  1. 如果整个ORDER BY子句是一个整数,则按投影子句的相应元素排序(ORDER BY 2按投影子句的第二个元素排序项目条款)

  2. 如果整个 ORDER BY 子句是标识符,则搜索具有此类别名的投影列表元素,或者,如果未找到,则搜索具有此类名称的列,然后排序据此。

  3. 否则,解析表达式。解析过程中只有列名可见,别名不可见。

因此在您的第一个查询中您遇到了第二种情况,因此您看到了别名,在您的第二个查询中您遇到了第三种情况,因此看不到它。

更新:似乎 PostgreSQL 具有完全相同的行为。在这里查看 Peter Eisentraut 的回答[ ORDER BY Alias not working ]

他总结了我所说的相同内容,但针对的是 PostgreSQL。 Order By 可以有别名(输出列)、整数或引用输入列的表达式。

关于mysql - 不能在 mysql 函数中使用别名作为 ORDER BY 子句的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27949182/

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