Error number: 3592; Symbol: ER_WINDOW_ILLEGAL_ORDER_BY; SQLSTATE: HY000
Message: Window ‘%s’: ORDER BY or PARTITION BY uses legacy position indication which is not supported, use expression.
Error number 3592 (ER_WINDOW_ILLEGAL_ORDER_BY): MySQL Error
详细说明:
Error number 3592(ER_WINDOW_ILLEGAL_ORDER_BY)表示MySQL不允许 window 分页子句中对 PARTITION BY 中列名进行排序。MySQL报出这个错误是因为在window 子句里使用了 order by 语句,而这个 order by 语句中使用了 partition by 子句中列名,这种操作是被禁止的。
Error number 3592(ER_WINDOW_ILLEGAL_ORDER_BY)常见的情况是在使用 MySQL 的 window 分页子句时,使用 order by 语句对 partition by 中列名进行排序。例如:
“`
SELECT product_id,
ROW_NUMBER() OVER(PARTITION BY product_id ORDER BY customer_id)
FROM purchase_history;
“`
解决方法:
要解决Error number 3592(ER_WINDOW_ILLEGAL_ORDER_BY)的错误,只需要确保 window 分页子句中的 order by 不包含任何 partition by 的字段即可。例如:
“`
SELECT product_id,
ROW_NUMBER() OVER(PARTITION BY product_id ORDER BY order_date)
FROM purchase_history;
“`
也可以使用 MySQL 的子查询来间接使用 order by 和 partition by 的字段,但为了避免出现 Error number 3592(ER_WINDOW_ILLEGAL_ORDER_BY)的错误,必须避免使用同一个父级查询的列名来排序 window 分页子句的结果。例如:
“`
SELECT product_id,
ROW_NUMBER() OVER(PARTITION BY product_id ORDER BY (SELECT order_date FROM purchase_history WHERE product_id = purchase_history.product_id))
FROM purchase_history;
“`
此外,为了避免出现此类的MySQL错误,建议在开发时注意有关 window 分页子句的使用规范,在开发前测试SQL语句是非常有必要的。