2011-08-14 5 views
2

4 개의 테이블이 있습니다. 이 테이블의 구조는 다음과 같습니다 (관련 컬럼 이름 만 표시하고 있음).가장 최근 레코드를 가져 오기위한 MySQL 쿼리

User (user_id) 
User_RecordType (user_id, recordType_id) 
RecordType (recordType_id) 
Record (recordType_id, record_timestamp, record_value) 

나는 특정 사용자가 액세스 할 수있는 각 RecordType에 대한 record_value 가장 최근의를 찾을 필요가있다. 시간 소인은 신기원 이후로 초 단위로 저장됩니다.

내가 사용자가 쿼리에 대한 액세스 권한을 가지고있는 RecordTypes를 얻을 수 있습니다 :

SELECT recordType_id 
FROM User, User_RecordType, RecordType 
WHERE User.user_id=User_RecordType.user_id 
AND User_RecordType.recordType_id=RecordType.recordType_id; 

어떤이 쿼리는 사용자가 액세스 할 수있는 것을 각 RECORDTYPE에 대한 가장 최근의 기록을 페치하지 않습니다. 이상적으로, 나는 하나의 질의와 스토어드 프로 시저를 사용하지 않고이 모든 것을하고 싶다.

그래서 누군가 제 SQL-fu를 빌려 주실 수 있습니까? 감사!

+1

'group-n-per-group' 태그를 추가했습니다. 이 질문은 StackOverflow에서 수십 번 대답되었습니다. 태그를 따르십시오. –

답변

3
SELECT 
    Record.recordType_id, 
    Record.record_value 
FROM 
    Record 
INNER JOIN 
    (
    SELECT 
    recordType_id, 
    MAX(record_timestamp) AS `record_timestamp` 
    FROM 
    Record 
    GROUP BY 
    recordType_id 
) max_values 
ON 
    max_values.recordType_id = Record.recordType_id 
AND 
    max_values.record_timestamp = Record.record_timestamp 
INNER JOIN 
    User_RecordType 
ON 
    UserRecordType.recordType_id = RecordType.recordType_id 
WHERE 
    User_RecordType.user_id = ? 
+0

레코드 테이블의 recordType_id 열이 고유 한 경우 'AND max_values.record_timestamp = Record.record_timestamp'조건이 필요하지 않습니다. 맞습니까? – wpearse

+0

그럴 경우 "가장 최근의 record_value", "각 레코드 유형에 대해 가장 최근의 레코드 가져 오기"를 요청하고 타임 스탬프에 대해 이야기하는 이유는 무엇입니까? 이것은 recordtype 당 하나 이상의 레코드가 있다는 것을 의미합니다 ... 결정하십시오! –

+0

미안 단, 당신 말이 맞아요. 나는 recordType_id 열과 record_id 열을 혼동했다. 내 실수. 귀하의 솔루션은 잘 작동합니다 - 많은 감사드립니다. – wpearse

관련 문제