2014-05-22 4 views
0

간단하지만 올바른 업데이트/선택 문을 작성하는 데 어려움을 겪고 있습니다.중첩 된 SQL 쿼리 및 업데이트

나는 POSTS라는 테이블이 있습니다. 테이블에는 PK 인 POSTID가 있습니다. 현재 PARENTID는 모두 NULL입니다. 또한 POSTS를 그룹화하는 레거시 숫자 값을 가진 GROUPID도 있습니다.

GROUPID의 예입니다. 하나의 스레드를 구성하는 3 개의 게시물이있는 경우 모두 GROUPID에서 동일한 값을 갖습니다.

내가하려는 것은 각 레코드를 반복하고 POSTID와 GROUPID를 기록하고 동일한 GROUPID를 가진 다른 모든 레코드를 선택하고 첫 번째 검색에서 언급 한 POSTID로 PARENTID를 업데이트하는 것입니다.

| POSTID | PARENTID | GROUPID | 
| 109 | NULL  | 20  | 
| 110 | 109  | 20  | 
| 111 | 109  | 20  | 
| 112 | NULL  | 21  | 
| 113 | 112  | 21  | 

내가 말이 희망을 다음과 같이

| POSTID | PARENTID | GROUPID | 
| 109 | NULL  | 20  | 
| 110 | NULL  | 20  | 
| 111 | NULL  | 20  | 
| 112 | NULL  | 21  | 
| 113 | NULL  | 21  | 

나는 그것을 만들고 싶어.

감사합니다.

+0

그냥 이해하기 위해, 당신은 분 (POSTID)에 GROUPID은 동일 추구하는거야? –

+0

네 ... 정확히 ... – user3662671

답변

2

질문을 올바르게 이해한다고 가정하면 min 집합체를 사용하여 자체 테이블로 되돌릴 수 있습니다. 그런 다음 케이스를 사용하여 최소 게시물 ID가 부모인지 아닌지를 결정할 수 있습니다. 당신이 당신의 테이블의 데이터를 update하려면

select t.postid, 
    case when postid <> minpostid then minpostid end parentid, 
    t.groupid 
from yourtable t 
    join (select groupid, min(postid) minpostid 
    from yourtable t2 
    group by groupid) t2 on t.groupid = t2.groupid 

, 당신은과 같은 쿼리를 사용할 수 있습니다 여기에

는이 작업을 수행하는 한 방법입니다 join :

update yourtable t 
    join (select groupid, min(postid) minpostid 
    from yourtable t2 
    group by groupid) t2 on t.groupid = t2.groupid 
set t.parentid = case when postid <> minpostid then minpostid end; 
+0

당신은 ... 어떤 종류의 MySQL 신 ... 나는 노랫 소리를 응시하고 있었다. 롤 ... 그리고 그처럼 아무것도 만들지 않았다. –

+0

완벽. 그것은 매력처럼 작동했습니다. 감사합니다 sgeddes! – user3662671