【发布时间】:2021-12-18 11:15:31
【问题描述】:
我已将数据库从 AWS Aurora 1.22.3(与 MySQL 5.6 兼容)迁移到 MySQL 8,并有一个查询返回账户及其父账户(如果是父账户,则返回子账户)。
帐户表将包含:
account_id(主键),parent_account_id(外键), 帐户名,...
例如,我有账户 520 和父账户 519:
account_id,tenant_id,parent_account_id,account_name,account_code,account_class,account_type,account_description,status,is_master_account,currency_code,tax_type,pending_balance,authorised_balance,total_balance,related_party_id,creator_id
519,1,NULL,"SANTOS LIMITED - Trade1",000604,ASSET,FINRECEIVABLE,NULL,ACTIVE,1,AUD,BASEXC,0.000000,0.000000,0.000000,321,1
520,1,519,"SANTOS LIMITED - Trade Card1",000604-1,ASSET,FINRECEIVABLE,NULL,ACTIVE,0,AUD,BASEXC,0.000000,0.000000,0.000000,321,1
这是我的查询:
SELECT
t_all.account_id -- , parent_level, t_all.level
FROM (
-- GET ALL CHILDREN
SELECT
account_id,
parent_account_id,
null as parent_level,
(@l:=@l + 1) AS level
FROM
(
SELECT
account_id,
tenant_id,
parent_account_id
FROM Account
ORDER BY
parent_account_id,
account_id
) account_sorted,
(
SELECT @pv := 520, @l := 0, @cl := 0
) initialisation
WHERE
account_id = @pv OR
find_in_set(parent_account_id, @pv) > 0
AND
@pv := concat(@pv, ',', account_id)
UNION
-- GET ALL PARENTS
SELECT
account_id,
parent_account_id,
level as parent_level,
null as level
FROM
(
SELECT
_id AS account_id,
parent_account_id,
@cl := @cl + 1 AS level
FROM
(
SELECT
@r AS _id,
(
SELECT @r := parent_account_id
FROM Account
WHERE account_id = @r
) AS parent_account_id,
@l := @l + 1 AS level
FROM
(
SELECT @r := 520, @l := 0, @cl := 0
) vars,
Account h
WHERE
@r <> 0
ORDER BY level DESC
) qi
) qo
) as t_all
order by level desc , parent_level asc;
旧版本(MySQL 5)将返回 3 条记录(520,519,520),而 MySQL 8 仅返回一个 account_id 520。预期输出与旧版本相同。
您认为可能导致问题的原因以及在迁移数据库版本时我应该如何确保查询结果一致?
非常感谢您的帮助。
【问题讨论】:
-
MySQL 8 已弃用对上述用户变量的支持。您应该使用递归 CTE 和/或分析函数。示例数据在这里会有所帮助。
-
感谢@TimBiegeleisen,我已经更新了问题中的示例数据。我应该搜索用户变量,看看它如何影响查询。
-
阅读有关使用 MySQL 8+ 的递归分层查询。
标签: mysql sql database database-migration amazon-aurora