문제

고 싶을 제공하는 조건에서는 안을 지정하여 쿼리 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 가.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top