我有一个如下所示的选择查询:
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:完整查询很复杂,我需要使用*
(列表列名不可能),我不能在主查询中使用限制因为连接,按顺序分组等等。
答案 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非常快地执行它。