2016-07-04 2 views
0

나는 두 개의 테이블이 보이는 하나가이 같은MySQL의 쿼리 가입, GROUP BY 및 최대

ID, Datetime, User_ID, Location and Status // the rest is not relevant 

그리고 다른 외모 :

ID, Lastname // the rest is not relevant 

지금은 단지 원하는 가장 높은 숫자가 Datetime 인 첫 번째 테이블을 User_ID에 입력하고 lastnameUser_ID 인 다른 테이블을 요청하십시오.

SELECT w.Datetime, w.User_ID, w.Status, e.Lastname 
FROM worktimes AS w 
INNER JOIN employees AS e 
ON w.User_ID=e.ID 
RIGHT JOIN (SELECT max(Datetime) AS Datetime, User_ID 
    FROM worktimes 
    WHERE Datetime>1467583200 AND Location='16' 
    GROUP BY User_ID 
    ORDER BY Datetime DESC 
) AS v 
ON v.User_ID=w.User_ID 
GROUP BY w.User_ID 
ORDER BY e.Nachname; 

누군가가 나에게 힌트 좀 주실 수 : 간단한 ...

나는 그것 (가장 유망한처럼 보이지만 nontheless 거짓 할말을 테잎)이 방법을 시도? ... 난 정말 지금이 잠시 동안 갇혀있어 지금은 내 머리에 약간의 매듭을 얻기 위해 시작 :(

+0

일부 데이터로 약간의 sqlfiddle을 작성하는 경우는 어떻습니까? 기대하는 것을 표로 보여주십시오. 누군가는 그것을 밖으로 내뱉습니다. – Drew

+0

오늘의 팁 : 오른쪽 결합에서 왼쪽 결합으로 전환하십시오! 사람들은 일반적으로 왼쪽 조인에 충분한 문제가 있습니다. 오른쪽 조인은 더 혼란 스럽습니다 ... 주 테이블이 선택적 데이터 조인을 떠났다고 생각하는 것이 더 쉽습니다. 선택적인 데이터 오른쪽 조인 테이블보다 쉽습니다. – jarlh

+0

이 다른 사람들은 훨씬 똑똑합니다. 더 많은 것을 알고 싶다. – Drew

답변

2

당신은 실제로 매우 가까운 :

SELECT w.Datetime, w.User_ID, w.Status, e.Lastname 
FROM worktimes w INNER JOIN 
    employees e 
    ON w.User_ID = e.ID LEFT JOIN 
    (SELECT max(Datetime) AS Datetime, User_ID 
     FROM worktimes 
     WHERE Datetime > 1467583200 AND Location = '16' 
     GROUP BY User_ID 
    ) ww 
    ON ww.User_ID = w.User_ID AND w.DateTime = ww.DateTime 
ORDER BY e.Nachname; 

주 :

  • 당신은 내가 LEFT JOIN로 교체. RIGHT JOIN는 불필요합니다. DateTime 값에 가입
  • 필요합니까,하지만 난 그게 당신이 중 하나를 원하는 것입니다 확실하지 않다. 당신이 있는지 확인하기 위해 INNER JOIN 시작 수 일 at는 당신이 원하는 것을 만들어냅니다.
  • 대부분의 경우 하위 쿼리에서 ORDER BY을 사용하지 마십시오.
  • 당신은 당신이 correlated subqueries로 알려져 있습니다에 대해 요구하는 어떤 외부 쿼리
+0

왼쪽 테이블이 너무 커서 왼쪽 조인을 사용할 수 없기 때문에 오른쪽 조인이 필요합니다. 하지만 오른쪽 조인으로 잘 작동하는 것 같습니다 ... 나는 더 테스트 할 것이지만 지금까지 감사합니다. 너는 큰 도움이된다. –

1

GROUP BY 필요하지 않습니다. 표준 SQL에서는 APPLYLATERAL 구문을 사용하여 구현할 수 있습니다. 유감스럽게도 모든 RDBMS가 이러한 고급 솔루션을 지원하는 것은 아닙니다. 예를 들어, MSSQL, 최신 버전 OraclePostgresql에는 이러한 구문이 있지만 입니다. IMHO, MySQL 사용자들에게는 근심이 있습니다. 근년에 MySQL은 표준 지향적이지만 약간 이상한 방식으로 시작 되었기 때문에 기본적으로 표준이 아닌 해킹을 해제하지만 표준 대응을 구현하지 않기 때문입니다. 예를 들어, 서브 쿼리의 정렬이 더 이상 지원되지 않고 더러운 해킹을 사용해야하는 경우 - 서브 쿼리에 LIMIT some_really_big_number을 추가하기 때문에 질문에 제공된 자신의 쿼리는 기본적으로 MySQL의 최신 버전에서 작동하지 않습니다.

+0

BTW, 이론적으로 정렬 된 테이블이 "집합"이 아니기 때문에 하위 쿼리에서 정렬이 작동하지 않는 이유는 "커서"입니다.내가 잘못하면 현명한 전문가들이 나를 교정 할 수 있기를 바랍니다. – Jacobian