7

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

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

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

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:完整的查询很复杂,我需要使用*(不可能列出列名),由于joins,group by order by等,我不能在主查询中使用limit。

4

2 回答 2

9

您收到错误的原因是由于 aliasing 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

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

于 2014-10-28T23:31:32.717 回答
2

我通过自加入修复了它:

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 执行速度非常快。

于 2013-10-30T13:32:41.307 回答