2011-02-25 8 views
0

이전 시스템에서 새 시스템으로 데이터를 전송할 변환기를 작성 중입니다. 나는 PHP + mysql을 사용하고있다.그룹 by mysql 옵션

중복 항목이있는 수백만 개의 레코드가있는 테이블이 하나 있습니다. 그 데이터를 새 테이블로 전송하고 모든 항목을 제거하고 싶습니다. 나는 하나 개의 테이블 :(

나는 그것을 숙고하고 처리하는 것이 나이 걸리는이 작업

select * 
from table1 
insert into table2 
ON DUPLICATE KEY UPDATE customer_information = concat('$firstName',',','$lastName') 

을 수행하기 위해 다음과 같은 쿼리와 의사 코드를 사용하고 그것으로 그룹을 사용하여 자동으로 모든 그룹화 기록을 얻을 수 있습니다? 예를 들어 각 레코드 통과하는 등 중복 체크를 제외

?

select * 
from table1 
group by firstName, lastName 
insert into table 2 only one record and add all users' 
first last name into column ALL_NAMES with comma 

EDIT

정보가 다른 고객마다 다른 기록이 있습니다. 사용자의 이름과 성이 동일하면 각 행을 복제라고합니다. 새 테이블에서는 한 고객과 구매 한 제품을 다른 열에 추가합니다 (우리는 4 개의 제품 만 보유).

+1

현재 데이터와 새로운 시스템의 형식을 알려주시겠습니까? 네가 여기서 뭘 하려는지 이해가 안돼. – krtek

+0

제발, 제발! ** 실제 ** 구조 ** 테이블 ** 및 ** 테이블 **의 몇 가지 예제 데이터로 실제 * 구조를 게시하십시오. 그런 다음 쿼리를 생성 할 정확한 것을 * 표시하십시오. 정확하고 상세한 데이터 및 정보를 통해 유용한 답변을 얻을 수 있습니다. 당신이 게시 한 것은 ...별로. – dnagirl

+0

@dnagirl, 제 질문을 잘 이해했다고 생각합니다. 귀하의 답변은 모든 문제를 다룹니다. – Tweet

답변

1

난 당신이하려고하는 모르겠어요 customer_information을 사용하면되지만 중복되지 않는 데이터 세트를 한 테이블에서 다른 테이블로 전송하려는 경우 작동합니다.

INSERT IGNORE INTO table2(field1, field2, ... fieldx) 
    SELECT DISTINCT field1, field2, ... fieldx 
    FROM table1; 

DISTINCT은 개의 중복 행을 처리합니다. 그러나 행이 부분 중복 (동일한 성 및 이름이지만 다른 이메일과 같음) 인 경우 IGNORE을 사용하면 도움이됩니다. table2 (lastname, firstname)에 고유 색인을 넣으면 IGNORE는 lastnameX, table1의 firstnameY이있는 첫 번째 레코드 만 삽입되도록합니다. 물론 부분 복제 쌍 중 어떤 레코드가 선택되는지는 마음에 들지 않을 수 있습니다.

ETA 이제 질문을 업데이트했는지

은, 당신이 하나 개의 필드에 여러 행의 값을 넣을 것으로 보인다. 일반적으로 말하자면, 입니다. 왜냐하면이 방법으로 데이터를 비정규 화하면 훨씬 쉽게 액세스 할 수 없기 때문입니다. 또한 (성, 이름)별로 그룹화하면 이름에 이름이 없습니다. 이 때문에 내 예제에서는 allemails를 대신 사용합니다. 어떤 경우 에든이 작업을 수행해야하는 경우 방법은 다음과 같습니다.

INSERT INTO table2(lastname, firstname, allemails) 
    SELECT lastname, firstname, GROUP_CONCAT(email) as allemails 
    FROM table1 
    GROUP BY lastname, firstname; 
+0

나는 그 "나쁜"생각은 당신에게 동의하지만, 누가 나에게 변화를 시작하기 전에 그것을 개발 한 사람이 아닌가. 나는 단지 내게 주어지는 일을 수행해야만한다 : ( – Tweet

1

그들은 정말 중복 행이있는 경우에 당신이 사용할 수있는 (모든 필드는 동일) :

select DISTINCT * from table1 

대신 :

select * from table1 
+0

"전체"중복 행은 없지만 이름과 성이 중복됩니다. 나는 대답과 의견을 읽은 후에 나의 질문을 업데이트했다. – Tweet