Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL korrelierte Unterabfrage in JOIN-Syntax

Die Antwort auf Ihre Frage lautet nein, es ist nicht möglich, auf Korrelationsnamen zu verweisen, wie Sie es tun. Die abgeleitete Tabelle wird von Ihrer inneren Abfrage erstellt, bevor die äußere Abfrage mit der Auswertung von Joins beginnt. Also die Korrelationsnamen wie t , tp , und u stehen der inneren Abfrage nicht zur Verfügung.

Um dies zu lösen, würde ich empfehlen, denselben konstanten ganzzahligen Wert in der inneren Abfrage zu verwenden und dann die abgeleitete Tabelle in der äußeren Abfrage mit einer realen Bedingung anstelle von 1=1 zu verknüpfen .

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;