edo1z blog

プログラミングなどに関するブログです

MySQL - 複数テーブルを連結して重複を削除しつつ、特定テーブルに存在するデータを削除する

複数テーブルの連結

  • union を使うと連結できます。

特定テーブルに存在するデータの削除

  • 特定テーブルをleft joinしたときに、特定テーブルの該当カラムに値があれば、特定テーブルに同じデータが存在するということになります。
  • ですので、left join しつつ、特定テーブルの該当カラムがnullなデータ探します。
  • 下記の場合、tmp.emailと同じデータをtable4が持っている場合、left joinの結果、table4.emailにも、tmp.emailと同じ値が入ります。逆に、table4が持っていない場合、table4.emailnullになります。
select concat(tmp.name1, " ", tmp.name2) as name, tmp.email from (
  (select name1, name2, trim(email) as email from table1)
  union
  (select name1, name2, trim(email) as email from table2)
  union
  (select name1, name2, trim(email) as email from table3)
) as tmp
left join table4 on tmp.email = table4.email
where table4.email is null
and tmp.email regexp '^[^@]+@[^@]+\.[^@]{2,}$'
group by tmp.email 
order by tmp.email asc;