用户定义的变量在MySQL 5.7中不起作用,但在v5.6中起作用

时间:2017-03-09 17:51:25

标签: mysql variables

我正在尝试使用User-Defined变量,它在MySQL 5.6.17中按预期工作,但在MySQL 5.7.10中给出了以下错误。

我找到了一个this question的工作示例,它失败并出现同样的错误。

我找不到任何文档或提及问题(相当宽泛的术语),并假设它是一个MySQL配置问题。任何人都可以帮助,或指出我正确的方向。

Query: SELECT T2.* FROM ( SELECT @r AS _id, (SELECT @r := parent_id FROM pos_port_attachments WHERE id = _id) AS parent_id, @l := @l + ...
Error Code: 1054
Unknown column '_id' in 'where clause'

这是我正在使用的SQL

SELECT T2.*
FROM (
    SELECT
    @r AS _id,
    (SELECT @r := parent_id FROM mytable WHERE id = _id) AS parent_id,
    @l := @l + 1 AS lvl
    FROM
    (SELECT @r := 100001, @l := 0) vars,
    pos_port_attachments m
    WHERE @r <> 0) T1
JOIN mytable T2
ON T1._id = T2.id
ORDER BY T1.lvl DESC;

2 个答案:

答案 0 :(得分:1)

我认为您需要将WHERE id = _id更改为

WHERE id = @ r

不确定为什么它适用于5.6

答案 1 :(得分:0)

我不知道为什么人们可以引用相关子查询中的别名。如果您使用未记录的“功能”,则不能依赖它将适用于功能版本。但是 - 假设ID总是大于PARENT_ID,那么这个仍然适用于{5.7}的http://rextester.com

select *
from (
    select t.*,
        case when t.id = @pid 
            then (@pid := t.parent_id) + 1
            else 0
        end as filter
    from some_table t
    cross join (select @pid := 31)init
    order by id desc
) t
where filter > 0
order by id asc;

这个也是:

select t.*,
    case when t.id = @pid 
        then (@pid := t.parent_id) + 1
        else 0
    end as filter
from some_table t
cross join (select @pid := 31)init
having filter > 0
order by id desc;

http://rextester.com/DZJLY71092