2013-03-12 2 views
1

내가 필요한 결과를 얻을 수는 없지만 서브 쿼리에 조인하려고합니다. 누군가 실행할 수있는 더 나은 쿼리를 제안하거나 하위 쿼리를 사용해서는 안됩니다 (SQL의 변형에 정통하지는 않습니다). 더 나은 쿼리 유형이 실행됩니까?서브 쿼리에 대한 MySQL 조인

제한된 SQL 지식으로 하위 쿼리가 최상의 위치에 있지 않음을 알 수 있습니다. 여기서 목표는 tblResults의 필드를 쿼리하고 동일한 resultid (동일한 resultid 값을 갖는 tblTraceOutput에 여러 행이 있으므로 마지막 행만) 인 tblTraceOutput의 마지막 행에 조인하는 것입니다.

SELECT r.`resultid`, r.`successful`, r.`result`, r.`testdate`, r.`changed`, 
t.`delay1`, t.`delay2`, t.`delay3` 
FROM `tblResults` AS r 
JOIN (
    SELECT `resultid`, `delay1`, `delay2`, `delay3` 
    FROM `tblTraceOutput` 
    WHERE `traceid`='48' 
    ORDER BY `outputid` DESC LIMIT 0,1 
) AS t ON (t.`resultid` = r.`resultid`) 
WHERE r.`traceid` = '48' ORDER BY r.`resultid` DESC LIMIT 0,20 

내가 JOINLEFT JOIN A와 나는 다시 내 쿼리하지만 첫 번째을 제외하고 모든 행에 t.delay1, t.delay2t.delay3, 의 세 개의 열 작성 'NULL'로 더 많은 결과를 얻을 것이다 변경하는 경우. 하위 쿼리에서 가져온 결과는 tblResults의 기본 쿼리 출력의 첫 번째 행에만 연결됩니다. 외부 쿼리에서 출력의 모든 행에 대해이 하위 쿼리를 실행하고 조인 할 수 있습니까? 내 머리에서

나는 다음과 같은 상상,하지만 난 그게 어떤 방식으로 작동 할 수 없습니다 :

SELECT r.`resultid`, r.`successful`, r.`result`, r.`testdate`, r.`changed` 
FROM `tblResults` AS r 
(
    SELECT t.`resultid`, t.`delay1`, t.`delay2`, t.`delay3` 
    FROM `tblTraceOutput` 
    WHERE `traceid`='48' 
    ORDER BY `outputid` DESC LIMIT 0,1 
) AS t 
JOIN ON (t.`resultid` = r.`resultid`) 
WHERE r.`traceid` = '48' ORDER BY r.`resultid` DESC LIMIT 0,20 

답변

1

나는 이것이 당신이 찾고있는 중 하나라고 생각합니다. 이 쿼리는 하위 쿼리를 사용하여 테이블 tblTraceOutput에있는 resultidresultid에 대해 각각 최신 outputid을 가져옵니다. 하위 쿼리의 결과는 하위 쿼리의 모든 열과 일치하는 경우 테이블 tblTraceOutput (그 자체는)으로 다시 결합됩니다. 일치시킬 수있는 레코드가 최신 레코드입니다.

SELECT a.*, b.* 
FROM tblResults a 
     INNER JOIN tblTraceOutput b 
      ON a.resultid = b.resultid 
     INNER JOIN 
     (
      SELECT resultid, traceid, MAX(outputid) max_ID 
      FROM tblTraceOutput 
      GROUP BY resultid, traceid 
     ) c ON b.resultid = c.resultid AND 
       b.traceid = c.traceid 
       b.outputid = c.max_ID 
WHERE a.traceid = 48 
ORDER BY resultid 
LIMIT 0, 20 
+1

우수 감사합니다. 오늘 새로운 것을 가르쳐 주셨습니다. 나는 나의 필요에 사소한 변경을 할 수 있고 완벽하다. 나는 두 번째 테이블을 그 자체에 결합시키는이 아이디어를 좋아한다! 고마워요. D – jwbensley

+0

당신은'도움이 돼서 기쁩니다. –

2
SELECT r.`resultid`, r.`successful`, r.`result`, r.`testdate`, r.`changed` 
FROM `tblResults` AS r 
LEFT JOIN `tblTraceOutput` as t ON (t.`resultid` = r.`resultid`) 
WHERE r.`traceid` = '48' ORDER BY r.`resultid` DESC LIMIT 0,20 

왼쪽 (반환 된 데이터가 NULL) 일치하는 것도이없는 경우에도 tblTraceOutput 테이블에서 결과 내부

만 ON 일치 resultid 및 tblTraceOutput에서 결과를 반환합니다 가입을 반환합니다 가입 절

1

LEFT JOIN을 사용하면 WHERE 절에 표현식을 포함하면 조인 된 테이블에 연결된 레코드가없는 레코드를 표시하지 않을 수 있습니다.

SELECT r.`resultid`, r.`successful`, r.`result`, r.`testdate`, r.`changed`, 
t.`delay1`, t.`delay2`, t.`delay3` 
FROM `tblResults` AS r 
LEFT JOIN `tblTraceOutput` AS t ON (t.`resultid` = r.`resultid`) 
WHERE r.`traceid` = '48' AND t.`resultid` IS NOT NULL 
ORDER BY r.`resultid` DESC 
LIMIT 0, 20;