2013-04-15 2 views
2

기존 데이터베이스를 단순화하고 기능을 확장하기 위해 기존 데이터베이스를 업데이트하고 있습니다. MySQL - 두 레코드, 각 레코드의 다른 필드 결합하기

ID Parent increment  info 1 info 2 
1 103  0   25  1 
2 103  1    4  2 
3 103  2   45  5 
4 103  3   13  7 
5 115  0   17  5 
6 115  1   23  3 
7 116  0   22  2 
8 116  1   1   1 
9 116  2   7   3 
10 117  0   19  4 

내가 새 테이블은 각 "부모"에 대한 하나 개의 기록을 포함하고, 그 기록이있다 그 부모 번호와 함께 기록에서 대부분의 필드에 대한 데이터가 포함되어야합니다 다음과 같이 나는 테이블이 최대 '증분'번호이지만 정보 2 필드의 경우 최소 증분과 함께 레코드의 데이터와 일치해야합니다.

ID Parent increment info 1 info 2 
4 103  3  13   1 
6 115  1  23   5 
9 116  2  7   2 
10 117  0  19   4 

MySQL을 가능한 기록 선택적 병합이 종류는 다음과 같이

원하는 출력입니까?

학부모가 그룹을 사용하여 보았지만 많은 양의 입력란이있어 가져올 항목이 너무 많아 잘 작동하지 않을 수 있습니다. 나는 또한 테이블의 LEFT OUTER JOIN을 보면서 최대 증가치를 가진 각 부모 내에서 레코드를 강조 표시했으나 같은 부모가 있지만 최소 증분 인 레코드에서 데이터를 선택할 수는 없었습니다.

정말 대단하며 누군가의 도움에 감사드립니다.

답변

1
SELECT tt1.ID, tt1.Parent, MaxInc, tt1.info1, tt2.info2 FROM 
(SELECT ID, Parent, MaxInc, info1 FROM test INNER JOIN 
(SELECT Parent AS p, MAX(incr) AS MaxInc FROM test GROUP BY Parent) AS t1 
ON Parent = p AND incr = MaxInc) AS tt1 INNER JOIN 
(SELECT Parent, info2 FROM test INNER JOIN 
(SELECT Parent AS p, MIN(incr) AS MinInc FROM test GROUP BY Parent) AS t2 
ON Parent = p AND incr = MinInc) AS tt2 ON tt1.Parent = tt2.Parent 

,369을 증분합니다
+0

환상적입니다. 꿈처럼 작동합니다. 나는 여기 뉴비지만 w770115, 그렇지 않으면이 답변을 투표 할 것이다. –

+0

또한 ms 액세스 mdf 파일에 동일한 쿼리를 적용하려고 시도하지만 join 오류가 계속 발생합니다. 이견있는 사람? –

+0

MS Access에서는 하위 쿼리를 다른 쿼리에서 수행해야하며이 쿼리에 내부 조인 할 수 있습니다. 여기에 : – w770115

2

예, 가능합니다. 당신이 추가 필드에 1부터 9까지 값만 가지고 있다고 가정 : 수정 된 데이터와

select * 
from t join 
    (select left(parent, locate(' ', parent) - 1) as p, 
      max(SUBSTRING(parent, locate(' ', parent) + 1)) as maxval 
     from t 
     group by left(parent, locate(' ', parent)) 
    ) tp 
    on left(t.parent, locate(' ', t.parent) - 1) = tp.p 
where t.parent = concate(tp.p, ' ', maxval) 

: 숫자 9를 넘어 가면

select t.* 
from t join 
    (select left(parent, locate(' ', parent) - 1) as p, 
      MAX(parent) as maxparent, 
      max(len 
     from t 
     group by left(parent, locate(' ', parent)) 
    ) tp 
    on left(t.parent, locate(' ', t.parent) - 1) = tp.p 
where t.parent = tp.maxparent 

, 당신은 같은 몇 가지 추가 손보는 필요 구조 : 내가 증가를 변경

select t.* 
from t join 
    (select parent, MAX(increment) as maxi 
     from t 
     group by parent 
    ) tp 
    on t.parent = tp.parent and t.increment = tp.maxi 
+0

놀랍도록 빠른 응답에 감사드립니다. 나는 그걸 가지고 놀고 다시보고 할 것이다. –

+0

은 locate ('', parent) -1) 언어가 필요합니까? 내 테이블 레이아웃은 분명하지 않았습니다. ive는 그것을 조금 정돈했다. –

+0

@TimCullen. .. 아니, 그만큼 문제가 단순해진다. 최종 답을 참조하십시오. –

관련 문제