仅当查询包装为子查询时,MySQL才会出现重复列错误

时间:2013-10-30 11:59:43

标签: mysql sql

我有一个如下所示的选择查询:

SELECT * FROM A
LEFT JOIN B ON B.x = A.y
LEFT JOIN C ...
WHERE ....
GROUP BY ...
ORDER BY ...;

所有表格都有id列,查询效果很好。结果有许多id列没有错误,驱动程序处理模糊问题。但我需要在结果上有LIMIT,所以我用另一个选择查询包装它,如下所示:

SELECT * FROM (
    SELECT * FROM A
    LEFT JOIN B ON B.x = A.y
    LEFT JOIN C ...
    WHERE ....
    GROUP BY ...
    ORDER BY ...
) AS x WHERE 1 LIMIT 1000;

现在我得到Duplicate column name 'id'错误!

PS:完整查询很复杂,我需要使用*(列表列名不可能),我不能在主查询中使用限制因为连接,按顺序分组等等。

2 个答案:

答案 0 :(得分:8)

您收到错误的原因是由于别名AS X。但问题实际上是您使用了*,而不是列出您想要的字段。

在第一个查询中,SELECT *实际上会生成以下字段:

A.id, A.name, A.description, B.id, B.name, B.date_started, C.id, C.name, C.isDeleted

这样可以正常工作,除非您尝试直接引用字段名称并且不使用它的别名。无论哪种方式,你的SQL引擎都不会有这个问题,不管你对结果集做什么都可能仍有问题。

但是,当您将查询移动到子查询中并为结果AS X添加别名时,您最终会得到:

X.id, X.name, X.description, X.id, X.name, X.date_started, X.id, X.name, X.isDeleted

现在你可以看到它为什么抱怨了。您可以看到为什么使用*也不好,因为这种组合可能会工作一段时间,然后您将一个新字段添加到现有表中,这与另一个表相同,并且每个你用这两个表写的查询,现在需要重写。

答案 1 :(得分:1)

我通过自我加入修复了它:

SELECT * FROM A
LEFT JOIN B ON B.x = A.y
LEFT JOIN C ...
JOIN (
    SELECT id FROM (
        SELECT id FROM A 
        WHERE ....
        GROUP BY ... 
        ORDER BY ...
    ) AS A1 WHERE 1 LIMIT 1000
) AS A2 ON A2.id = A.id
WHERE 1

MySQL非常快地执行它。