mysql 动态 row_number 生成问题
mysql dynamic row_number generation issue
我尝试根据来自网络的引用为 MySQL 创建一个行号。
查询如下
存在一种情况,当审计 ID 不相同时,row_number
变量需要递增 1。否则 row_number
相同[每行递增]。
但是,由于 having; condition{[row_number>3]}
中有引用,row_number
再次递增。
所以,我在结果中得到奇数 row_number
。请帮忙。
这意味着下面查询的结果有 5,7,9,
etc.,因为 row_number
而不是 4,5,6,
etc.,
注意:这里的AUDIT_ID
列是大整数。
SELECT
@row_number:=CASE WHEN @audit_id = AUDIT_ID then @row_number
else
@row_number+1
end AS row_number,
@audit_id:=AUDIT_ID as AUDIT_ID from
(
SELECT AUDIT_ID from AUDIT where <somecondition>
UNION ALL
SELECT AUDIT_ID from AUDIT where <somecondition>
)
TABLE ,(SELECT @row_number:=0, @audit_id:=0) AS temp
having row_number >3
首先,您需要修复 AUDIT_ID
列的顺序,必须对其进行排序才能获得正确的 row_number
为此,我在并集部分添加了 ORDER BY AUDIT_ID
然后您正在使用 having
别名 row_number
的子句它将重新 run/evaluate 针对您的 row_number
定义的表达式(即情况...)别名因此您的 row_number
与您希望过滤掉小于 3 的结果,您需要将整个查询包装在另一个子 select 中,例如 select * from (your query) t1 where some conditon
SELECT *
FROM (
SELECT
@row_number:=CASE WHEN @audit_id = AUDIT_ID
THEN @row_number
ELSE @row_number+1
END AS row_number,
@audit_id:=AUDIT_ID AS AUDIT_ID
FROM (
SELECT AUDIT_ID FROM AUDIT WHERE <somecondition>
UNION ALL
SELECT AUDIT_ID FROM AUDIT WHERE <somecondition>
ORDER BY AUDIT_ID
) t,
(SELECT @row_number:=0, @audit_id:=0) AS temp
) t1
WHERE row_number >3
我尝试根据来自网络的引用为 MySQL 创建一个行号。
查询如下
存在一种情况,当审计 ID 不相同时,row_number
变量需要递增 1。否则 row_number
相同[每行递增]。
但是,由于 having; condition{[row_number>3]}
中有引用,row_number
再次递增。
所以,我在结果中得到奇数 row_number
。请帮忙。
这意味着下面查询的结果有 5,7,9,
etc.,因为 row_number
而不是 4,5,6,
etc.,
注意:这里的AUDIT_ID
列是大整数。
SELECT
@row_number:=CASE WHEN @audit_id = AUDIT_ID then @row_number
else
@row_number+1
end AS row_number,
@audit_id:=AUDIT_ID as AUDIT_ID from
(
SELECT AUDIT_ID from AUDIT where <somecondition>
UNION ALL
SELECT AUDIT_ID from AUDIT where <somecondition>
)
TABLE ,(SELECT @row_number:=0, @audit_id:=0) AS temp
having row_number >3
首先,您需要修复 AUDIT_ID
列的顺序,必须对其进行排序才能获得正确的 row_number
为此,我在并集部分添加了 ORDER BY AUDIT_ID
然后您正在使用 having
别名 row_number
的子句它将重新 run/evaluate 针对您的 row_number
定义的表达式(即情况...)别名因此您的 row_number
与您希望过滤掉小于 3 的结果,您需要将整个查询包装在另一个子 select 中,例如 select * from (your query) t1 where some conditon
SELECT *
FROM (
SELECT
@row_number:=CASE WHEN @audit_id = AUDIT_ID
THEN @row_number
ELSE @row_number+1
END AS row_number,
@audit_id:=AUDIT_ID AS AUDIT_ID
FROM (
SELECT AUDIT_ID FROM AUDIT WHERE <somecondition>
UNION ALL
SELECT AUDIT_ID FROM AUDIT WHERE <somecondition>
ORDER BY AUDIT_ID
) t,
(SELECT @row_number:=0, @audit_id:=0) AS temp
) t1
WHERE row_number >3