2014-10-17 4 views
0

내 데이터베이스에서 다음과 같은 테이블이 있습니다은 가입

USERS

+-------+-------------------------------------+ 
| id |    name     | 
+-------+-------------------------------------+ 
| 1 | Johnny Appleseed     | 
| 2 | Pete Jones       | 
| 3 | John Doe       | 
| 4 | Jane Plick       | 
+-------+-------------------------------------+ 

보고서를 내가해야 할 일은

+-------+-------+-----------------------------+ 
| id | owner | title      | 
+-------+-------+-----------------------------+ 
| 1 | 1  | Weekly report #86   | 
| 2 | 1  | Weekly report #87   | 
| 3 | 1  | Weekly report #88   | 
| 4 | 2  | Weekly report #1   | 
| 5 | 3  | Weekly report #33   | 
| 6 | 3  | Weekly report #34   | 
+-------+-------------------------------------+ 

GROUP은 결과를 이름으로 처리하므로 목록 자체는 사전 순이지만 마지막 발생이 필요합니다. 사용자의 ID와 일치하는 행의

REPORTS 테이블의 "owner"열은 USERS 테이블의 "id"열과 일치합니다.

Jane Plick  |  
John Doe   | Weekly Report #34 
Johnny Appleseed | Weekly Report #88 
Pete Jones  | Weekly Report #1 

나의 현재 쿼리 거의 작동 그러나 그것은 마지막 해당 사용자에 대한 FIRST 주간 보고서,하지를 보여줍니다

내 원하는 결과는 다음과 같다.

SELECT * FROM users AS a LEFT JOIN ppp_reports AS b ON a.id=b.owner WHERE a.active=1 GROUP BY a.id ORDER BY a.firstname ASC 

다양한 변형을 시도했지만 항상 REPORTS 테이블의 첫 번째 행이 남아 있습니다.

도움을 주시면 대단히 감사하겠습니다. 모든 보고서는 "주간 보고서 #X"의 이름을 지정하는 특정 경우

+0

이는 '그룹 기준'을 수행 할 때 표준적인 동작입니다. 그룹에서 요청 된 모든 필드를 채우기 위해 일치하는 레코드에서 첫 번째/가장 이른 값을 선택합니다. 이것은 기본적으로 "그룹당 최상위 n"이며, 여기서 맨은 "최근"이고 n은 1입니다. –

+0

'reports' 테이블의'id'에 대한 가장 높은 숫자 값이 가장 최근 값이라고 가정합니까, 아니면 보고서의 유효 기간을 결정하는 추가 필드 (타임 스탬프와 같은)가 있습니까? –

답변

0

, 당신이 시도 할 수 있습니다 :

SELECT a.id, a.name, MAX(b.title) 
    FROM users AS a 
    LEFT JOIN ppp_reports AS b ON a.id=b.owner 
WHERE a.active=1 
GROUP BY a.id, a.name 
ORDER BY a.name ASC 

this fiddle를 참조하십시오.

보고서에 다른 이름이있을 수있는 경우 다른 보고서와 구분할 수있는 다른 방법을 찾아야합니다.

+0

이것은 잘 풀렸다. ppp_reports 테이블의 ID가 항상 증가하므로 사용자 ID와 일치하는 마지막 보고서는 항상 최신입니다. 그래서 MAX (b.title) 대신 MAX (b.id)를했는데 이제는 모두 좋았습니다. – matcartmill

0

보고서 ID가 날짜별로 번호가 매겨져 있다고 가정하면, 즉 보고서 ID 2 보고서 ID 1 일 이후 항상이 두 쿼리 작업을해야합니다 :

select t.id, t.name, r.title from 
    (select u.id, u.name, max(r.id) as report_id 
    from users u 
    left join reports r on r.owner = u.id 
    group by u.id, u.name) as t 
    left join reports r on t.report_id = r.id; 

또는

select u.id, u.name, r.title from 
    users u 
    left join 
    (select r.owner, max(r.id) as report_id 
    from reports r 
    group by r.owner) as latest_report on u.id = latest_report.owner 
    left join reports r on latest_report.report_id = r.id; 

아이디어는 점이다 사용자 ID별로 올바른 보고서를 식별 한 다음 보고서 테이블을 다시 결합하여 보고서의 올바른 이름을 가져와야합니다.

Link to SQL Fiddle