mariadb CTE,如何重用选定的订单?

maraidb CTE, how to reuse selected order?

我有一个查询,其中我有一个 CTE 按特定顺序选择一些行,我想对我的主数据集使用相同的顺序我返回:

WITH selector (id) AS (SELECT id FROM ..... ORDER BY something)
SELECT ...
FROM users u
JOIN selector s ON s.id = u.id
ORDER BY FIELD(u.id, (SELECT id FROM selector))

但这在最后一个 ORDER BY FIELD 语句中是无效的语法,因为子查询 returns 多于一行,是否可以实现这样的目标?

函数 FIELD() 需要值列表而不是查询结果。

您可以使用函数 GROUP_CONCAT() to create a comma separated list of ids returned by the CTE, ordered by your conditions and then the function FIND_IN_SET() 将 CTE 加入 table 并按其结果排序:

WITH selector (ids) AS (SELECT GROUP_CONCAT(id ORDER BY something) FROM .....)
SELECT ...
FROM users u INNER JOIN selector s 
ON FIND_IN_SET(u.id, s.ids)
ORDER BY FIND_IN_SET(u.id, s.ids)

或者,使用 ROW_NUMBER() window 函数:

WITH selector (id, rn) AS (SELECT id, ROW_NUMBER() OVER (ORDER BY something) FROM .....)
SELECT ...
FROM users u INNER JOIN selector s 
ON s.id = u.id
ORDER BY s.rn