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
我有一个查询,其中我有一个 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