2014-04-30 4 views
-1

시스템을 통해 드라이버 둘러보기를 요청할 수 있습니다. 한 명 이상의 운전 기사가 같은 여행을 요청하면 먼저 우리와 함께 일하기 시작한 사람에게갑니다. 그들이 같은 날에 시작하면 나는 가장 오래된 사람이 투어를 얻을 수 있도록 생일이 필요합니다. 나는 그 여행의 가장 낮은 연공 서열과 일치하는 직원의 생일에 도착 어떻게MySQL : 다중 테이블 조인

SELECT T.*, ER.SEN, requestcnt FROM tours T LEFT OUTER JOIN ( SELECT 
R.tourid, count(R.requestid) AS requestcnt, MIN(E.SEN) AS SEN 
     FROM requests R 
     INNER JOIN employees E ON E.employeeid = R.employeeid WHERE Funktion = 'XY' 
     GROUP by R.tourid 
     ) SR ON ER.tourid = U.tourid 

: 여기

Table 3: Requests with the tourid as well as the employeeid

Table 2: Tours

Table 1: Data of the employees SEN = Date of Entry, BIR = Birthday

내 쿼리입니다. 방금 초 선택 진술에 생일 필드를 추가하면 투어를 요청하지 않았더라도 전반적으로 가장 낮은 연공 서열을 가진 직원의 생일을 얻습니다.

목표는 투어의 양 때문에 하나의 쿼리에 모든 것을 포함시키는 것입니다. 이 쿼리는 둘러보기 페이지 용이므로 둘러보기의 사용 가능 여부에 따라 웃음을 표시 할 수 있습니다.

어떤 조언을 주셔서 감사합니다!

+2

샘플 데이터, 원하는 결과와 질문을 수정하시기 바랍니다, 당신의 질문이 왜 작동하지 않는지 설명하십시오. –

답변

0

요청 및 직원에 대해 다른 조인을하고있을 가능성이 있습니다. 이 같은

뭔가 : -

SELECT T.*, ER2.SEN, ER2.BIR, requestcnt 
FROM tours T 
LEFT OUTER JOIN 
(
    SELECT R.tourid, count(R.requestid) AS requestcnt, MIN(E.SEN) AS SEN 
    FROM requests R 
    INNER JOIN employees E ON E.employeeid = R.employeeid 
    WHERE Funktion = 'XY' 
    GROUP by R.tourid 
) ER 
ON ER.tourid = U.tourid 
LEFT OUTER JOIN 
(
    SELECT R.tourid, E.SEN, MIN(E.BIR) AS BIR 
    FROM requests R 
    INNER JOIN employees E ON E.employeeid = R.employeeid 
    WHERE Funktion = 'XY' 
    GROUP by R.tourid, E.SEN 
) ER2 
ON ER2.tourid = U.tourid 
AND ER.SEN = ER2.SEN 

편집 - 당신이 정말와 (그걸 얻기 위해 MIN/MAX 기능을 사용할 수 없기 때문에 아무것도의 3 얻기 개정 요청

의 경우는 어색 분을 찾아서 제외하기 위해 사용할 수있는 많은 노력, 그 결과로 다시 등등). 조인 된 하위 쿼리는 그룹당이 아닌 쿼리의 전체 결과에서 작동하므로 실제로는 제한을 쉽게 사용할 수 없습니다.

내 머리 꼭대기에서 생각할 수있는 두 가지 방법. 먼저 하위 쿼리에 시퀀스 번호를 추가하여 우선 순위 순서대로 결과를 얻습니다. 그러면 tourid가 재설정됩니다. 이 같은

뭔가 (테스트되지 않음) : -

SELECT T.*, ER2.SEN, ER2.BIR, requestcnt 
FROM tours T 
LEFT OUTER JOIN 
(
    SELECT R.tourid, count(R.requestid) AS requestcnt 
    FROM requests R 
    INNER JOIN employees E ON E.employeeid = R.employeeid 
    WHERE Funktion = 'XY' 
    GROUP by R.tourid 
) ER 
ON ER.tourid = T.tourid 
LEFT OUTER JOIN 
(
    SELECT R.tourid, E.employeeid, E.SEN, E.BIR, @seq:=IF([email protected], @seq+1, 1) AS seq 
    FROM requests R 
    INNER JOIN employees E ON E.employeeid = R.employeeid 
    CROSS JOIN (SELECT @seq:=0, @tourid:=0) 
    WHERE Funktion = 'XY' 
    ORDER BY R.tourid, E.SEN, E.BIR, E.employeeid 
) ER2 
ON ER2.tourid = T.tourid 
AND ER2.seq = 3 

또 다른 방법은 SELECT에 상관 서브 쿼리를 사용하는 것입니다. 행의 수가 증가 반환이 아마 크게 둔화 될 : -

SELECT T.*, 
     (
      SELECT E.SEN 
      FROM requests R 
      INNER JOIN employees E ON E.employeeid = R.employeeid 
      WHERE Funktion = 'XY' 
      AND R.tourid = T.tourid 
      ORDER BY E.SEN, E.BIR 
      LIMIT 3,1 
     ), 
     (
      SELECT E.BIR 
      FROM requests R 
      INNER JOIN employees E ON E.employeeid = R.employeeid 
      WHERE Funktion = 'XY' 
      AND R.tourid = T.tourid 
      ORDER BY E.SEN, E.BIR 
      LIMIT 3,1 
     ), 
     requestcnt 
FROM tours T 
LEFT OUTER JOIN 
(
    SELECT R.tourid, count(R.requestid) AS requestcnt 
    FROM requests R 
    INNER JOIN employees E ON E.employeeid = R.employeeid 
    WHERE Funktion = 'XY' 
    GROUP by R.tourid 
) ER 
ON ER.tourid = T.tourid 

또는 아마도 절 (다시 테스트하지) WHERE의를

SELECT T.*, EM.SEN, EM.BIR, EM.employeeid, 
     requestcnt 
FROM tours T 
CROSS JOIN employees EM 
LEFT OUTER JOIN 
(
    SELECT R.tourid, count(R.requestid) AS requestcnt 
    FROM requests R 
    INNER JOIN employees E ON E.employeeid = R.employeeid 
    WHERE Funktion = 'XY' 
    GROUP by R.tourid 
) ER 
ON ER.tourid = T.tourid 
WHERE EM.employeeid = 
(
    SELECT E.employeeid 
    FROM requests R 
    INNER JOIN employees E ON E.employeeid = R.employeeid 
    WHERE Funktion = 'XY' 
    AND R.tourid = T.tourid 
    ORDER BY E.SEN, E.BIR 
    LIMIT 3,1 
) 
+0

완료! 고맙습니다!!!! – user3549835

+0

지금 문제가 있습니다. 당신이 올린 것과 비슷한 요청으로 제 3의 연공 서열을 가진 직원이 필요합니다. 위의 게시물은 가장 오래된 (연공 서열 및 연령)입니다. 나는 LIMIT로 수정하려했으나 해결책을 찾지 못했습니다. 더 도움을 주셔서 감사합니다! 같은 날에 나와 함께 일하기 시작한 직원이 몇 명이라면 그 직원을 3 번째로 오래 받아야합니다. – user3549835

+0

몇 가지 제안을했지만 테스트하지는 않았습니다. 희망 그들은 도움이됩니다. – Kickstart