簡體   English   中英

將一個表的不同記錄插入另一個到MySQL

[英]Insert distinct records of one table to another into MySQL

表1:mydata_table
多列。 但是我想獲取3列的不同記錄。

Email_Office | 電子郵件_個人1 | Email_Personal2

表2:unique_emails

只有3列。 Email_Office | 電子郵件_個人1 | Email_Personal2

我嘗試對表2的所有三列使用此代碼,以從每列插入不同的記錄。

insert into unique_emails 
(email_personal1) 
select distinct email_personal1
from mydata_table
where Email_Personal1!=""

它插入記錄,但是問題是,如果email_office列中有100行,而email_personal1中有300行,那么它將顯示前100行中的email_office,其余兩列為空,然后從第101行開始,它將顯示email_personal1的記錄,其余兩行列為空。 我想將所有行一起插入。 我怎樣才能做到這一點?

如果要插入唯一的三元組電子郵件,則應使用

insert into unique_emails 
(email_office, email_personal1, email_personal2) 
select distinct email_office, email_personal1, email_personal2
from mydata_table
where email_office!="" OR Email_Personal1!="" OR Email_Personal2!=""

但是在那種情況下,某些電子郵件可能在表unique_emails中多次出現。

假設表1包含記錄:

Email_Office | Email_Personal1 | Email_Personal2
------------------------------------------------
a@a.com        b@b.com           c@c.com
a@a.com        b@b.com           c@c.com
a@a.com        b@b.com           e@e.com
a@a.com        c@c.com           NULL
a@a.com        d@d.com           e@e.com

然后結果表2

 Email_Office | Email_Personal1 | Email_Personal2   
------------------------------------------------
a@a.com        b@b.com           c@c.com
               c@c.com           e@e.com
               d@d.com

UPD。 試試這個:( SQL Fiddle

insert into unique_emails 
(email_office, email_personal1, email_personal2)
select b.email_office, c.email_personal1, d.email_personal2
from (
  select @i := @i + 1 AS pos from mydata_table, (select @i := 0) r) a
left join (
  select t.*, @j := @j + 1 AS pos
  from (select distinct email_office from mydata_table where email_office!="") t,
    (select @j := 0) r) b on b.pos = a.pos
left join (
  select t.*, @k := @k + 1 AS pos
  from (select distinct email_personal1 from mydata_table where email_personal1!="") t,
    (select @k := 0) r) c on c.pos = a.pos
left join (
  select t.*, @l := @l + 1 AS pos
  from (select distinct email_personal2 from mydata_table where email_personal2!="") t,
    (select @l := 0) r) d on d.pos = a.pos
where b.email_office is not null or c.email_personal1 is not null or d.email_personal2 is not null

嘗試為需要唯一的列創建唯一索引,並使用@Sergey提出的第一個SQL並忽略:

INSERT IGNORE INTO
  unique_emails 
  (email_office, email_personal1, email_personal2) 
  SELECT DISTINCT
    email_office,
    email_personal1,
    email_personal2
  FROM
    mydata_table
  WHERE
    email_office!=""
    OR Email_Personal1!=""
    OR Email_Personal2!=""

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM