2012-01-20 5 views
2

두 개의 테이블이 있습니다 : 코스와 퍼미션. 주어진 계정에서 주어진 학생의 기존 강의에 대한 최신 권한 값을 보여주는 SELECT을 해보려고합니다.MySQL이 최신 날짜의 레코드를 선택했습니다.

SELECT COURSES.NAME, PERMISSIONS.VALUE, PERMISSIONS.TS 
FROM COURSES LEFT JOIN PERMISSIONS 
ON PERMISSIONS.C_ID = COURSES.C_ID AND PERMISSIONS.S_ID = '12345' 
WHERE COURSES.A_ID = 'ABCDE' 

내가 얻을 결과는 내가 최신 타임 스탬프 (TS) 만 기록을 보여주는 것입니다 무엇이 필요

NAME   | VALUE | TS 
----------------------------------------------- 
Mathematics | 1  | 2012-01-19 19:13:21 
Mathematics | 0  | 2012-01-19 19:13:15 
Mathematics | 0  | 2012-01-19 19:20:19 
Mathematics | 0  | 2012-01-19 19:20:27 
Mathematics | 0  | 2012-01-19 19:21:29 
Biology  |   | 

입니다 그래서 이것을 보여줍니다 지금

, 나는 이렇게 :

NAME   | VALUE | TS 
----------------------------------------------- 
Mathematics | 0  | 2012-01-19 19:21:29 
Biology  |   | 

은 내가 TI상의 ORDER BY와 함께 코스 이름을 GROUP BY 시도 mestamp하지만 올바른 레코드를 가져 오지 않았습니다.

아무도 도와 줄 수 있습니까?

답변

0
SELECT COURSES.NAME, PL.VALUE, PL.TS 
FROM COURSES 
LEFT JOIN 
    (SELECT 
     PERMISSIONS.C_ID, PERMISSIONS.VALUE, PERMISSIONS.TS 
    FROM PERMISSIONS 
    JOIN 
     (SELECT P.C_ID, MAX(P.TS) AS LATEST 
     FROM PERMISSIONS P 
     WHERE P.S_ID = '12345' 
     GROUP BY P.C_ID) PG 
    ON PERMISSIONS.TS = PG.LATEST) PL 
    ON PL.C_ID = COURSES.C_ID 
WHERE COURSES.A_ID = 'ABCDE' 

을 데이터 크기에 PERMISSIONS 테이블에 대한 (C_ID, TS)에 색인을 추가하여 최신 날짜를 빠르게 찾을 수 있습니다.

ALTER TABLE `PERMISSIONS` ADD INDEX (`C_ID`,`TS`); 
+0

잘 했어! 바른 길로 나를 잡았어. 두 번째 하위 'ELECT '에'PERMISSIONS.S_ID = '12345'가 추가되었습니다. – greener

2

HAVING을 사용해야합니다. 그래서 (이 테이블 구조와 쉬울 것)

또 다른 가능성은 그것을 반대 방향으로 생각하는이

SELECT COURSES.NAME, PERMISSIONS.VALUE, PERMISSIONS.TS 
FROM COURSES LEFT JOIN PERMISSIONS 
ON PERMISSIONS.C_ID = COURSES.C_ID AND PERMISSIONS.S_ID = '12345' 
WHERE COURSES.A_ID = 'ABCDE' 
GROUP BY COURSES.A_ID 
HAVING PERMISSIONS.TS = MAX(PERMISSIONS.TS) 

같은 것을로 가야한다. 자체에 대한 사용 권한 테이블을 가입하고 높은 타임 스탬프

SELECT COURSES.NAME, PA.VALUE, PA.TS 
    FROM COURSES LEFT JOIN PERMISSIONS PA 
    ON PA.C_ID = COURSES.C_ID AND PA.S_ID = '12345' 
    WHERE COURSES.A_ID = 'ABCDE' 
     AND (PA.C_ID == NULL || NOT EXISTS (
      SELECT * 
      FROM PERMISSIONS PB 
      WHERE PA.C_ID = PB.C_ID AND PB.S_ID = '12345' AND PB.TS > PA.TS)) 
+0

두 옵션을 모두 시도했지만 예상대로 결과가 아닙니다. HAVING 옵션은 예를 들어 레코드를 리턴하지 않습니다. – greener

+0

HAVING에 오류가있을 수 있습니다. 다른 문제는 무엇입니까? 다중 수학 라인 또는 생물학 없음 (실제로, 그렇다, 나는 null 케이스를 놓치고있다) – Luis

0

또 다른 대안이없는 권한 찾을 - 권한 테이블의 최대 타임 스탬프 계산 하위 선택 : 따라

SELECT courses.name, x.value, x.timestamp 
FROM courses 
LEFT JOIN (SELECT p1.c_id, p1.s_id, p1.value, p1.timestamp 
    FROM permissions p1 
    LEFT JOIN permissions p2 ON p1.c_id = p2.c_id AND p1.s_id = p2.s_id AND p1.timestamp < p2.timestamp 
    WHERE p2.timestamp IS NULL) x ON courses.c_id = x.c_id AND x.s_id = '12345' 
WHERE courses.a_id = 'ABCDE' 
관련 문제