我想通过指定innertable.id = outsidetable.id在内部查询中提供WHERE条件。但是,MySQL(5.0.45)报告“’where子句’中的未知列’outertable.id’”。这种查询可能吗?
内部查询使用GROUP BY将行旋转到列。这可以完全在外部查询中执行,但是由于额外的联接可能会导致额外的开销。
或者,我可以在内部查询中省略WHERE条件,而指定ON ON externaltable.id = innerquery.id,但随后它将获取整个内部查询行集以再次连接外部查询,这效率很低。
实际的SQL如下所示:
select t.ticketid, u.userid, t.fullname, u.loginapi_userid, t.email, tp.subject, tp.contents, a.PhoneNumber, a.Location, a.Extension, a.BusinessUnit, a.Department from swtickets t inner join swticketposts tp on t.ticketid = tp.ticketid inner join swusers u on t.userid = u.userid left join ( select cfv.typeid, min(case cfv.customfieldid when 1 then cfv.fieldvalue end) as 'PhoneNumber', min(case cfv.customfieldid when 3 then cfv.fieldvalue end) as 'Location', min(case cfv.customfieldid when 5 then cfv.fieldvalue end) as 'Extension', min(case cfv.customfieldid when 8 then cfv.fieldvalue end) as 'BusinessUnit', min(case cfv.customfieldid when 9 then cfv.fieldvalue end) as 'Department' from swcustomfieldvalues cfv where cfv.typeid = t.ticketid group by cfv.typeid ) as a on 1 = 1 where t.ticketid = 2458;
您的问题的答案是否定的,因为您正在做的过程中不可能引用相关名称。派生表由您的内部查询生成,然后外部查询开始评估联接。因此,相关名称(例如t,tp和)u不可用于内部查询。
t
tp
u
为了解决这个问题,我建议在内部查询中使用相同的常量整数值,然后使用实际条件而不是在外部查询中将派生表联接在一起1=1。
1=1
SELECT t.ticketid, u.userid, t.fullname, u.loginapi_userid, t.email, tp.subject, tp.contents, a.PhoneNumber, a.Location, a.Extension, a.BusinessUnit, a.Department FROM swtickets t INNER JOIN swticketposts tp ON (t.ticketid = tp.ticketid) INNER JOIN swusers u ON (t.userid = u.userid) LEFT OUTER JOIN ( SELECT cfv.typeid, MIN(CASE cfv.customfieldid WHEN 1 THEN cfv.fieldvalue END) AS 'PhoneNumber', MIN(CASE cfv.customfieldid WHEN 3 THEN cfv.fieldvalue END) AS 'Location', MIN(CASE cfv.customfieldid WHEN 5 THEN cfv.fieldvalue END) AS 'Extension', MIN(CASE cfv.customfieldid WHEN 8 THEN cfv.fieldvalue END) AS 'BusinessUnit', MIN(CASE cfv.customfieldid WHEN 9 THEN cfv.fieldvalue END) AS 'Department' FROM swcustomfieldvalues cfv WHERE cfv.typeid = 2458 GROUP BY cfv.typeid ) AS a ON (a.typeid = t.ticketid) WHERE t.ticketid = 2458;