Mysql
 sql >> Base de données >  >> RDS >> Mysql

Sous-requête MySQL corrélée dans la syntaxe JOIN

La réponse à votre question est non, il n'est pas possible de référencer des noms de corrélation comme vous le faites. La table dérivée est produite par votre requête interne avant que la requête externe ne commence à évaluer les jointures. Ainsi, les noms de corrélation comme t , tp , et u ne sont pas disponibles pour la requête interne.

Pour résoudre ce problème, je vous recommande d'utiliser la même valeur entière constante dans la requête interne, puis de joindre la table dérivée dans la requête externe en utilisant une condition réelle au lieu de 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;