将 mysql 变量替换为 Join
Replace mysql variables with Join
我正在使用 MySQL 5-enterprise-commercial
版本。
我已经编写了以下 2 个查询,我想使用 join 将它们转换为单个查询。
SET @row_number :=0;
SELECT
@row_number:= case
when @RId = r_id then @row_number + 1
else 1
end as rnum,
@RId:=r_id as r_id,
msg,
supplier,
rrtry from (
SELECT
a.r_id as r_id,
mta.message as msg,
tpr.supplier as supplier,
trw.retry as rrtry,
a.createdAt as createdAt,
FROM sa.nra a,
sa.nmta mta,
sa.treq tpr,
sa.twflw trw
WHERE tpr.n_r_id = a.r_id
AND trw.astp = mta.stp
AND mta.rstatus in ('FAIL')
AND tpr.p_w_id = trw.id
AND a.a_mid = mta.id
AND a.createdAt BETWEEN now() - interval 30 DAY AND now()
ORDER BY a.r_id
) as sa
HAVING rnum = 1
ORDER BY createdAt DESC;
基本上,r_id
有多个条目,我想获取特定 r_id
的最新条目,这就是我使用 ORDER BY a_createdAt DESC
[=16= 的原因]
将查询与使用 :=
运算符设置变量的子查询连接起来。
SELECT
@row_number:= case
when @RId = r_id then @row_number + 1
else 1
end as rnum,
@RId:=r_id as r_id,
msg,
supplier,
rrtry
from (
SELECT
a.r_id as r_id,
mta.message as msg,
tpr.supplier as supplier,
trw.retry as rrtry,
a.createdAt as createdAt
FROM sa.nra a
JOIN sa.nmta mta ON a.a_mid = mta.id
JOIN sa.treq tpr ON tpr.n_r_id = a.r_id
JOIN sa.twflw trw ON trw.astp = mta.stp AND tpr.p_w_id = trw.id
WHERE mta.rstatus in ('FAIL')
ORDER BY a.r_id
) as sa
CROSS JOIN (SELECT @row_number := 0) AS vars
HAVING rnum = 1
ORDER BY a_createdAt DESC;
我已将子查询中的 cross-product 替换为 ANSI JOIN。
如果您使用的是 MySQL 8.0,则可以使用 RANK()
或 ROW_NUMBER()
window 函数代替用户变量。
我正在使用 MySQL 5-enterprise-commercial
版本。
我已经编写了以下 2 个查询,我想使用 join 将它们转换为单个查询。
SET @row_number :=0;
SELECT
@row_number:= case
when @RId = r_id then @row_number + 1
else 1
end as rnum,
@RId:=r_id as r_id,
msg,
supplier,
rrtry from (
SELECT
a.r_id as r_id,
mta.message as msg,
tpr.supplier as supplier,
trw.retry as rrtry,
a.createdAt as createdAt,
FROM sa.nra a,
sa.nmta mta,
sa.treq tpr,
sa.twflw trw
WHERE tpr.n_r_id = a.r_id
AND trw.astp = mta.stp
AND mta.rstatus in ('FAIL')
AND tpr.p_w_id = trw.id
AND a.a_mid = mta.id
AND a.createdAt BETWEEN now() - interval 30 DAY AND now()
ORDER BY a.r_id
) as sa
HAVING rnum = 1
ORDER BY createdAt DESC;
基本上,r_id
有多个条目,我想获取特定 r_id
的最新条目,这就是我使用 ORDER BY a_createdAt DESC
[=16= 的原因]
将查询与使用 :=
运算符设置变量的子查询连接起来。
SELECT
@row_number:= case
when @RId = r_id then @row_number + 1
else 1
end as rnum,
@RId:=r_id as r_id,
msg,
supplier,
rrtry
from (
SELECT
a.r_id as r_id,
mta.message as msg,
tpr.supplier as supplier,
trw.retry as rrtry,
a.createdAt as createdAt
FROM sa.nra a
JOIN sa.nmta mta ON a.a_mid = mta.id
JOIN sa.treq tpr ON tpr.n_r_id = a.r_id
JOIN sa.twflw trw ON trw.astp = mta.stp AND tpr.p_w_id = trw.id
WHERE mta.rstatus in ('FAIL')
ORDER BY a.r_id
) as sa
CROSS JOIN (SELECT @row_number := 0) AS vars
HAVING rnum = 1
ORDER BY a_createdAt DESC;
我已将子查询中的 cross-product 替换为 ANSI JOIN。
如果您使用的是 MySQL 8.0,则可以使用 RANK()
或 ROW_NUMBER()
window 函数代替用户变量。