在mysql中同时使用concat和子字符串/子字符串索引时出现SQL错误1166

在mysql中同时使用concat和子字符串/子字符串索引时出现SQL错误1166,mysql,Mysql,我在mysql中同时使用concat和substring_index时遇到了一个奇怪的错误,我的代码在这里 CREATE TEMPORARY TABLE candidate (ori int, dest int, myPath varchar(500), depth int ) as ( select transforms.ori, baseTransforms.dest, concat(substring_index(baseTransforms.road,',',-1),',',su

我在mysql中同时使用concat和substring_index时遇到了一个奇怪的错误,我的代码在这里

CREATE TEMPORARY TABLE candidate (ori int, dest int, myPath varchar(500), depth int ) as (
    select transforms.ori, baseTransforms.dest, concat(substring_index(baseTransforms.road,',',-1),',',substring_index(transforms.road,',',1)), 2
    from transforms, baseTransforms
    where transforms.dest=baseTransforms.ori and transforms.ori <> baseTransforms.dest);
baseTransform的数据是这样填充的

insert into baseTransforms select * from transforms;
然后我得到

错误代码:1166。不正确的列名“concatsubstring_indexbaseTransforms.road”,,,,-1,,,substring_indextransforms.road,,,,,1”

但是当我通过删除一个子串索引阶段来修改代码时,它不会引发错误,即

CREATE TEMPORARY TABLE candidate (ori int, dest int, myPath varchar(500), depth int ) as (
        select transforms.ori, baseTransforms.dest, concat(',',substring_index(transforms.road,',',1)), 2
        from transforms, baseTransforms
        where transforms.dest=baseTransforms.ori and transforms.ori <> baseTransforms.dest);

这两种方法都很有效,所以事实上两个列名都是正确的,这太令人困惑了

p、 当我尝试使用子字符串函数而不是子字符串索引时,它遇到了同样的问题

有人能帮我解决这个问题吗?

,但是默认情况下,成为子查询中列名的CONCAT表达式超出了这个范围


您可以在其后面加上“路径”或类似名称,为该列指定一个固定的短名称。

非常感谢!我以前不知道concat表达式的结果会默认成为列名。
CREATE TEMPORARY TABLE candidate (ori int, dest int, myPath varchar(500), depth int ) as (
        select transforms.ori, baseTransforms.dest, concat(',',substring_index(transforms.road,',',1)), 2
        from transforms, baseTransforms
        where transforms.dest=baseTransforms.ori and transforms.ori <> baseTransforms.dest);
CREATE TEMPORARY TABLE candidate (ori int, dest int, myPath varchar(500), depth int ) as (
        select transforms.ori, baseTransforms.dest, concat(substring_index(baseTransforms.road,',',-1),','), 2
        from transforms, baseTransforms
        where transforms.dest=baseTransforms.ori and transforms.ori <> baseTransforms.dest);