I would like to provide a WHERE condition on an inner query by specifying innertable.id = outertable.id. However, MySQL (5.0.45) reports ‘Unknown column ‘outertable.id’ in ‘where clause”. Is this type of query possible?
The inner query is pivoting rows to columns using a GROUP BY. This could be entirely be performed in the outer query, but would possibly incur additional overhead due to the extra joins.
Alternatively, I can leave off the WHERE condition in the inner query and instead specify an ON outertable.id = innerquery.id, but it would then fetch the entire inner query rowset to join again the outer, which is inefficient.
The actual SQL appears below:
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;
The answer to your question is no, it is not possible to reference correlation names as you are doing. The derived table is produced by your inner query before the outer query starts evaluating joins. So the correlation names like
t,tp, anduare not available to the inner query.To solve this, I’d recommend using the same constant integer value in the inner query, and then join the derived table in the outer query using a real condition instead of
1=1.