2009-07-29 4 views
0

우리는 온라인 프로젝트 관리 시스템을 사용하며 다소 확장하려고합니다.SQL 다중 테이블 쿼리 지원 - 중복 결과 반환

그것은 관심의 다음과 같은 테이블이

:

 
todo_itemStatus: 
+--------------+-----------------------+------+-----+---------------------+----------------+ 
| Field  | Type     | Null | Key | Default    | Extra   | 
+--------------+-----------------------+------+-----+---------------------+----------------+ 
| itemStatusId | bigint(20) unsigned | NO | PRI | NULL    | auto_increment | 
| itemId  | int(10) unsigned  | NO | MUL | 0     |    | 
| statusDate | datetime    | NO |  | 0000-00-00 00:00:00 |    | 
| statusKey | tinyint(3) unsigned | NO |  | 0     |    | 
| memberId  | mediumint(8) unsigned | NO |  | 0     |    | 
+--------------+-----------------------+------+-----+---------------------+----------------+ 

이 테이블은 작업이 완료되면 추적을 유지하고, 모든 작업 변경의 상태를 유지합니다.

그러면 프로젝트 테이블과 '항목'(또는 작업) 테이블이 있습니다.

기본적으로 작업 완료율에 대한 세부 정보가 포함 된 프로젝트 목록을 추출 할 수 있기를 원합니다. 그러나 지금은 프로젝트의 각 작업을 완료했는지 여부에 대한 세부 정보로 나열하면 행복 할 것입니다.

알고있는 한 가장 최근의 작업 상태를 얻는 가장 좋은 방법은 statusDate가 가장 최신 인 todo_itemStatus를 선택하는 것입니다. itemId가 가장 큰 itemId는 작업과 같습니다. 관심.

<pre> 
select todo_item.itemId, todo_item.title, todo_itemStatus.statusKey, todo_itemStatus.statusDate 
from todo_item, todo_project, todo_itemStatus 
where todo_item.projectId = todo_project.projectId 
and todo_project.projectId = 13 
and todo_itemStatus.itemId = todo_item.itemId 
and todo_itemStatus.statusDate = (
    select MAX(todo_itemStatus.statusDate) 
    from todo_itemStatus key1 where todo_itemStatus.itemId = key1.itemId); 
</pre> 

그러나,이 같은 출력의 모든 상태 업데이트를 얻을 수 :

은이 같은 쿼리를 시도 내가 하나를 원하는대로 내가 원하는 것이 아니다

 
+--------+-----------------------------------------------------------------------------+-----------+---------------------+ 
| itemId | title                  | statusKey | statusDate   | 
+--------+-----------------------------------------------------------------------------+-----------+---------------------+ 
| 579 | test complete item - delete me            |   1 | 2009-07-28 13:04:38 | 
| 579 | test complete item - delete me            |   0 | 2009-07-28 14:12:12 | 
+--------+-----------------------------------------------------------------------------+-----------+---------------------+ 

todo_itemStatus 테이블의 가장 최근 항목에서 statusKey/statusDate를 리턴하는 태스크 항목.

나는 내 설명에서 다소 모호하다는 것을 알고 있지만, 나는 거대한 메시지를 쓰고 싶지 않았다. 필요한 경우 훨씬 더 자세한 정보를 제공 할 수 있습니다.

누군가 내가 뭘 잘못하고 있다고 제안 할 수 있습니까? 실제 데이터베이스를 작성한 이후로 오랜 시간이 걸렸으므로 여기서 내가 잘못하고있는 것이 확실하지 않습니다 ...

많은 감사! 데이브

답변

0

다음과 같은 쿼리는 내가 원하는 것을 :

 
select todo_item.itemId, todo_item.title, todo_itemStatus.statusKey, todo_itemStatus.statusDate from todo_itemStatus, todo_item where todo_item.itemId = todo_itemStatus.itemId and todo_item.projectId = 13 and todo_itemStatus.statusDate = (select MAX(status.statusDate) from todo_itemStatus as status where status.itemId = todo_item.itemId); 

그래서 나는 지금 행복 해요. 모든 도움과 제안에 감사드립니다.

데이브.

1

당신은 DISTINCT 키워드 (마이크로 소프트 SQL 서버)

편집을 사용하여 조사한다 : 난 그냥 질문을 다시 읽어 봤는데, GROUP BY 절은이 상황에서 더 적합하다고 생각합니다.

SELECT todo_itemStatus.itemStatusId, MAX(todo_itemStatus.statusDate) 
FROM todo_item, todo_project, todo_itemStatus 
WHERE todo_item.projectId = todo_project.projectId 
AND todo_itemStatus.itemId = todo_item.itemId 
AND todo_project.projectId = 13 
GROUP BY itemStatusId 

우리는 다음 아이디의이 세트에 자체 조인이의 나머지를 얻을 : 당신은 그러나 기본적으로 당신이 먼저 GROUP BY 절을 사용하여 관심있는 열을 선택한다 무엇을해야하는지, http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/ 읽어야 열이 우리에 관심이 : 나는 좀 더 실험을 한

SELECT 
    todo_item.itemId, 
    todo_item.title, 
    todo_itemStatus.statusKey, 
    todo_itemStatus.statusDate 
FROM todo_item 
JOIN todo_itemStatus 
ON todo_itemStatus.itemId = todo_item.itemId 
JOIN 
    (SELECT todo_itemStatus.itemStatusId, MAX(todo_itemStatus.statusDate) 
    FROM todo_item, todo_project, todo_itemStatus 
    WHERE todo_item.projectId = todo_project.projectId 
    AND todo_itemStatus.itemId = todo_item.itemId 
    AND todo_project.projectId = 13 
    GROUP BY itemStatusId) AS x 
ON todo_itemStatus.itemStatusId = x.itemStatusId 
+0

안녕하세요,하지만 DISTINCT가 내가 원하는대로 할 것이라고 생각하지 않습니다. 문제는 이들이 todo_item 당 여러 todo_itemStatus 항목이며 가장 최근의 항목을 얻고 싶다는 것입니다. 나는 비록 틀릴 수 있었다 ...그러나 빠른 테스트는 단지 오류를 산출했습니다. – DaveS

+0

질문을 다시 읽으십시오. 실제로 GROUP BY가 필요하다고 생각합니다 - 여러분에게 atm을 위해 뭔가를 찾으려고합니다. – Justin

+0

고마워. 이 기사를 살펴보고 게시물을 다시 읽은 다음 어떻게 시작하는지 알려 드리겠습니다. 고맙습니다! – DaveS