MySQL 상관된 하위에서 가입한 구문
-
22-08-2019 - |
문제
고 싶을 제공하는 조건에서는 안을 지정하여 쿼리 innertable.id=outertable.id 입니다.그러나,MySQL(5.0.45)보고서"Unknown column'outertable.id'에서'where'".은 이러한 유형의 쿼리 가능한가요?
안 쿼리가 선회 행를 사용하여 열에 의해 그룹.이 될 수 있는 전적으로 수행할 외부에서 쿼리하지만,가능성이 추가로 발생한 오버헤드 때문에 추가 합니다.
또는,내가 할 수 있는 상태에서 안 쿼리하고 대신 지정에 outertable.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
되지 않은 사용할 수 있는 내면 쿼리가 있습니다.
이를 해결하기 위해,나는 추천 사용하여 동일한 상수 정수 값에 안 쿼리,그리고 다음에 참여 파생된 테이블에서 외부 쿼리를 사용하여 실제 조건을 대신 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;
다른 팁
당신이 사용하는 Entity-속성-가치 디자인,그리고 궁극적으로는 아무 방법이 확장하려는 경우를 생성하는 결과 기존의 설정합니다.지하려고 이렇게 중 하나에서 쿼리가 있습니다.
대신,쿼리의 표준화된 테이블에서는 먼저:
SELECT t.ticketid, u.userid, t.fullname, u.loginapi_userid, t.email,
tp.subject, tp.contents
FROM swtickets t
INNER JOIN swticketposts tp ON (t.ticketid = tp.ticketid)
INNER JOIN swusers u ON (t.userid = u.userid)
WHERE t.ticketid = 2458;
그리고 사용자 지정 필드와 결과는 여러 행에의 결과로 설정:
SELECT cfv.customfieldid, cfv.fieldvalue
FROM swcustomfieldvalues cfv
WHERE cfv.typeid = 2458;
당신을 얻을 것이 여러 행에서 결과 집합,한 행위는 각 사용자 정의 필드:
+---------------+--------------+
| customfieldid | fieldvalue |
+---------------+--------------+
| 1 | 415-555-1234 |
| 3 | Third office |
| 5 | 123 |
| 8 | Support |
| 9 | Engineering |
+---------------+--------------+
당신은 다음을 응용 프로그램 코드를 작성하여 지도 결정되는 분야를 응용 프로그램 개체 분야,루프에서.
엔터티를 사용하여 특성-가치 테이블에서 이 방법은 확장성의 측면에서 모두 성능과 코드를 유지 보수입니다.
쓰겠다고 그것이 여러 조인.당신이 말할 때는"가능성이 추가로 발생한 오버헤드"하는 말을 하지 않은 테스트를 확인 할 수 있습니다.이 있으면 괜찮은 인덱스이 결합하는 것은 매우 간단하다.
또한 이것을 보여줍니다 하나의 함정의 일반적인"개최"모든 테이블의 디자인 패턴입니다.
내 제안이 될 거라고 당신이 무엇을 배제의 근거에 효율이다.E.g.밖으로 떠나 where 절을 사용하여 가입니다(t.면 ticketid 가=니다.면 ticketid 가)
수 있는 증명에 대한 당신의 생각은 비효율성에 의해 몇 가지 구체적인 참조를 제공합니다.나는 무엇을 말하고 있는지 어떤 방법을 사용하여 모든 행 외부에서 쿼리가 가입되는 모든 행에서 내부 쿼리도록에 따라 실행 계획되지 않을 수 있으로 비효율적으로 당신은 용의자가 있습니까?
내가 상상하는 문제입니다'다..포인터를 사용 하 여 수신=t.면 ticketid 가'그?나에 대해 생각하는 것하는 동안,MySQL 지원 상관된 하위,당신이 무엇을 하려고 그것처럼 보인다 실패 할 수 있습에 참여하기 때문에'내부'쿼리지 정말로는'내부'쿼리의 나머지 부분처럼에서는 절이 있습니다.하지만 그것은 다음과 같 있습니다 where 절 밖으로 하위하고 당신의 가입 조건에.포인터를 사용 하 여 수신=t.면 ticketid 가.