这主要是SQL语法/ SQL功能问题。为什么以下查询不起作用:
SELECT * from
(
select m.*, p.type,
from multipliers m
inner join pushes p
on m.push_id = p.id
where p.type = 'CONSTANT'
) AS res1 where res1.push_id = (
select max(push_id) from res1
);
以下内容完成时没有问题:
SELECT * from
(
select m.*, p.type,
from multipliers m
inner join pushes p
on m.push_id = p.id
where p.type = 'CONSTANT'
) AS res1 where res1.push_id = (
select max(push_id) from
(
select m.push_id
from multipliers m
inner join pushes p
on m.push_id = p.id
where p.type = 'CONSTANT'
) AS res2
);
答案 0 :(得分:0)
第一个查询无效,因为所选列不存在。至少如果你想重复使用它,它应该是res.push_id
,无论如何,使用CTE会更好,正如Jarlh在评论中所说的那样。
WITH
myCte AS ( select m.*, p.type,
from multipliers m
inner join pushes p
on m.push_id = p.id
where p.type = 'CONSTANT')
SELECT * FROM myCte
WHERE myCte.push_id = (SELECT MAX(push_id) FROM myCte)
答案 1 :(得分:0)
Per the MySQL 5.7 documentation:
派生表不能是相关子查询,也不能包含外部引用或对同一SELECT的其他表的引用。
换句话说,您无法在子查询中引用派生表。文档没有说明这一点,但由于OOO问题,它可能以这种方式起作用,因为派生表不必在子查询之前处理。在MySQL 8.0中,您将能够使用Common Table Expression or CTE,它基本上允许您在查询之前定义可重用的派生表,但在此之前使用您的第二种方法。
答案 2 :(得分:0)
第一个查询中的错误是表别名(相关名称)不能用作FROM中的表表达式。
带有点和列的表别名标识表的列。 (在谓词逻辑或关系演算中,表别名是子行值变量。)