2012-12-24 1 views
1

많은 감사를 병합 MySQL의 연속 키 값을 기준으로 행을 결합하고 읽기

나는이 다음 표 (뷰) 생성

#id_internal type BOOK_ID  Writer  Title  Loan_person_id Loan_Date  Return_Date 
    120  1  1002 Writer1   Book1  2   2012-05-21  2012-06-04 
    131  0  1002 Writer1   Book1  2   0000-00-00  2012-05-21 
    134  0  1002 Writer1   Book1  2   0000-00-00  2012-05-21 
    153  1  1002 Writer1   Book1  2   2012-05-21  2012-06-04 
    162  0  1002 Writer1   Book1  2   0000-00-00  2012-05-21 
    165  1  1002 Writer1   Book1  2   2012-05-21  2012-06-04 
    252  1  1012 Writer2   Book2  2   2012-05-23  2012-06-06 
    253  0  1012 Writer2   Book2  2   0000-00-00  2012-05-23 
    383  1  1012 Writer2   Book2  2   2012-05-23  2012-06-06 
    389  0  1012 Writer2   Book2  2   0000-00-00  2012-05-24 
    13  1  1008 Writer3   Book3  3   2012-05-20  2012-06-03 

하는 기본적으로 모델 내 작은 덮은! 기 학교에 대한 도서관 대출 로그.

다음을 수행하는 SQL 문을 작성하는 방법을 찾으려고합니다. 그림에 표시된 id_internal 필드를 기반으로 한 번에 두 행 결합 (첫 번째 두 행 - 두 번 이상 튜플이 존재하거나 끝에 하나만 존재 함) 하나의 열이 더있는 새로운 것을 생성하십시오.

집합의 한 행 (유형 = 1)은 책 대출을 설명합니다. 즉 대출 한 시간과 도서관으로 되돌려 보낼 시간을 말합니다. 두 번째 행 (항상 0000 : 00 : 00 및 필드 유형 = 0 Loan_Date를 가짐)은 책이 반환 된 실제 날짜를 설명합니다. 새 행에는 첫 번째 행에 포함 된 모든 정보와 새 열은 책의 실제 반환 날짜가됩니다. Book_ID 및 Loan_person_id (책을 빌린 독자의 경우) 및 TYPE (값 0 (반환) 및 1 (대출))에 대한 열이 있습니다.

SQL에서 내 기본 능력에서 초기 중간 역량에 이르기까지 GROUP BY 및 GROUP CONCAT을 올바르게 사용하지 못했습니다. 답변 또는 길 찾기를 기다리고 있습니다.
많은 감사 다시 디노

편집 : 결과는

 
Before Processing: 
#id_internal type BOOK_ID  Writer  Title  Loan_person_id Loan_Date  Return_Date 
    120  1  1002 Writer1   Book1  2   2012-05-21  2012-06-04 
    131  0  1002 Writer1   Book1  2   0000-00-00  2012-05-21 
After processing : 
Keep one of two id_internal (does not matter): 
#id_internal type BOOK_ID  Writer  Title  Loan_person_id Loan_Date  Return_Date Real_Return_Date 
    120  1  1002 Writer1   Book1  2   2012-05-21  2012-06-04  2012-05-21 


많은 감사

+0

문제가있는 SQL을 게시하는 것이 좋습니다. 이 모든 텍스트보다 당신이 잘못하고있는 것을 정확하게 찾아내는 데 도움이 될 것입니다. – duffymo

+0

죄송합니다. 생각했던 것처럼 이미지를 게시 할 수 없었습니다. 대신 텍스트를 사용했습니다. 독서에 대한 많은 감사. –

+0

표가 아닙니다. 당신이 시도한 SQL. – duffymo

답변

0

나는 모든 책을 원하는 가정입니다 (우리가보기를 사용하자) 형식이어야합니다 대출 (유형 = 1)이므로 ids 120과 153은 별도의 행이어야합니다. 131과 134은 같은 날짜가 있기 때문에

select t.*, 
     (select min(ReturnDate) from t t2 where t.bookid = t2.bookid and t2.id > t.id and t2.type = 0) as ReturnDate 
from t 
where type = 1 

이 데이터를 저장하기위한 작동합니다

다음 쿼리는 후 주어진 대출을 책 발생 최소 대출 날짜를합니다. 다음 대출 전에 최대 날짜를 얻는 것은 MySQL에서 훨씬 더 복잡합니다.

+0

그것은 작동합니다! 많은 많은 감사 (존중!). 나는 그것이 SQL 문 길이에서 훨씬 더 확장 될 것이라고 생각했다. –

+0

기분에 따라 "from t t2"를 설명하는 줄을 버리십시오. 그것은 어떤 종류의 조인입니까? –

+0

'select' 절의 하위 쿼리는 상관 된 하위 쿼리입니다. 't2 '는 서브 쿼리의 "t"와 외부 쿼리의 "t"를 구별하기 위해 사용되는 별칭입니다. 조인 조건은 둘 다 사용합니다. 필자는 select 절에서 상관 관계가있는 하위 쿼리에 대해 열렬한 팬이 아니지만, MySQL에서 종종 필요한 작업을 수행 할 수있는 유일한 방법입니다. –

관련 문제