2011-02-25 110 views
0

我正在寫一個轉換器來將數據從舊系統傳輸到新系統。我正在使用php + mysql。group by mysql option

我有一個包含重複條目的百萬條記錄的表。我想在新表格中傳輸數據並刪除所有條目。我使用下面的查詢和僞代碼來執行此任務

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 

編輯

有不同的記錄爲每個客戶提供不同的信息。如果用戶的姓名和姓氏相同,則每行都被稱爲重複。在新表格中,我們將只添加一個客戶和他們購買的產品到不同的列(我們只有4個產品)。

+1

您可以舉一個當前數據和新系統格式的例子。我真的不明白你在這裏做什麼。 – krtek 2011-02-25 15:07:00

+0

請,請!將* actual *結構與** table1和table2的一些示例數據一起發佈。然後顯示*確切*你想要查詢產生什麼。準確和詳細的數據和信息將爲您提供有用的答案。你發佈的內容...並非如此。 – dnagirl 2011-02-25 21:07:30

+0

@dnagirl,我想你很瞭解我的問題。因爲你的回答覆蓋/解決了我所有的問題。 – Tweet 2011-02-25 22:38:20

回答

1

我不知道你想用customer_information做,但如果你只是想將一個表中的非重複數據組從一個錶轉移到另一個表,這將起作用:

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

DISTINCT將處理確切的重複的行。但是如果你有隻有部分重複的行(比如最後和名字相同但是不同的電子郵件),那麼IGNORE可以提供幫助。如果您在table2(lastname,firstname)上放置了唯一索引,那麼IGNORE將確保只插入帶有來自table1的lastnameX,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 2011-02-25 22:39:05

1

如果他們真的重複的行(每個字段是相同的),那麼你可以使用:的

select DISTINCT * from table1 

代替:

select * from table1 
+0

沒有「完整」重複行,但名字和姓氏是重複的。在閱讀答案和評論後,我更新了我的問題。 – Tweet 2011-02-25 20:12:38