Mysql 8 CASE..WHEN..THEN..END 抛出语法错误

Mysql 8 CASE..WHEN..THEN..END throws syntax error

我有这个查询,它在 Mysql 5.* 中没有问题,但我最近升级到 MySQL 8,现在查询抛出如下语法错误:

您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在 'row_number, @breed'

附近使用的正确语法

查询是(为简单起见删除了许多无用的细节):

SELECT `name`, `age`, breed
                FROM (
                    SELECT
                        `dogs`.`name`,
                        `dogs`.`age`,
                         @row_number:=CASE WHEN @breed=breed
                                     THEN @row_number+1
                                     ELSE 1
                                END AS row_number
                     , @breed:=breed AS breed
                FROM `dogs` /* other details with joins, subqueries and limits left out for simplicity*/;

breed 应该维护一个行数,这样我就可以得到按 breed 分组的行的 n 行。也就是说,如果 n=2,例如,我的结果将是:

name | age | breed
------------------
fifi | 2 | labrador
bingo | 5 | labrador
rocket | 1 | german shepherd
sky | 1 german shepherd

我的主要问题是为什么会出现语法错误。 Google, 是我的朋友,但在这种情况下不是......我试过了。我也尝试删除“as”,在 case/when/then/end 周围添加括号,但没有快乐!

我不确定 MySQL 8 是否以与 MySQL 5.x 相同的方式支持用户变量。无论如何,您当前的语法至少已被弃用,您应该只使用 ROW_NUMBER 分析函数。例如,假设您想要每个品种的两只最小的动物,您可以尝试:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY breed ORDER BY age) rn
    FROM dogs
    -- maybe joins here
)

SELECT name, age, breed
FROM cte
WHERE rn <= 2;