Mysql

將 3 個 mysql 表合併為一個,沒有重複

  • May 22, 2018

我想合併 3 個表數據,每個表都有一個共同的數字列,但所有其他數據都不同。

我想要實現的是從公共列中選擇所有數據,並根據數字列合併所有表中的其餘列。

請記住,表格之間的數字列可以有重複項。

t1
------------------------------
| number | stuff 1 | stuff 2 |
------------------------------
|   1    |    x    |    y    |
------------------------------

t2
-------------------------------------------------------
| number | data 1 | data 2 | data 3 | data 4 | data 5 |
-------------------------------------------------------
|   2    |    a   |   b    |   c    |   d    |   e    |
-------------------------------------------------------

t3
----------------------------------------------
| number | info 1 | info 2 | info 3 | info 4 |
----------------------------------------------
|   1    |   j    |   k    |   l    |   m    |
----------------------------------------------
|   3    |   j    |   k    |   l    |   m    |
----------------------------------------------

Merged Table
------------------------------------------------------------------
| number | stuff 1 | stuff 2 | data 2 | data 5 | info 1 | info 4 |
------------------------------------------------------------------
|   1    |    x    |    y    |        |        |   l    |   m    |
------------------------------------------------------------------
|   2    |         |         |    b   |    e   |        |        |
------------------------------------------------------------------
|   3    |         |         |        |        |    l   |    m   |
------------------------------------------------------------------

實際數字不得重複,但該數字的 3 個表中的任何數據都必須合併到一行。

如果它可以做到ON DUPLICATE KEY UPDATE,那將是一個獎勵,所以我可以每隔幾天執行一次這個查詢來添加任何新數據

先感謝您

SELECT tt0.number
    , tt1.`stuff 1`
    , tt1.`stuff 2`
    , tt2.`data 2`
    , tt2.`data 5`
    , tt3.`info 1`
    , tt3.`info 4`
FROM (   SELECT t1.number FROM t1
      UNION DISTINCT
        SELECT t2.number FROM t2
      UNION DISTINCT
        SELECT t3.number FROM t3
    ) tt0
LEFT JOIN t1 tt1 ON tt0.number = tt1.number
LEFT JOIN t2 tt2 ON tt0.number = tt2.number
LEFT JOIN t3 tt3 ON tt0.number = tt3.number

此查詢假定該number欄位是每個表中的主鍵或至少是唯一鍵。

更新:

不幸的是,這給了我錯誤,說有重複的數字條目

如果您收到錯誤,您描述的不是 MySQL 錯誤

http://www.sqlfiddle.com/#!9/22d82dc/1

具有或多或少這樣的架構:

create table t1 (
number1 text,
stuff1 text,
stuff2 text);

insert into t1 (number1,stuff1,stuff2) values ('1', 'x', 'y');

create table t2 (
number1 text,
data1 text,
data2 text,
data3 text,
data4 text,
data5 text);

insert into t2 (number1,data1,data2,data3,data4,data5) values('2','a','b','c','d','e');

create table t3 (
number1 text,
info1 text,
info2 text,
info3 text,
info4 text);

insert into t3 (number1,info1,info2,info3,info4) values ('1','j','k','l','m');
insert into t3 (number1,info1,info2,info3,info4) values ('3','j','k','l','m');

您可以使用此查詢準確地實現您想要的:

select x.number1,max(stuff1) stuff1,max(stuff2) stuff2,max(data1) data1,max(data2)data2,max(data3) data3,max(data4) data4,max(data5) data5,max(info1) info1,max(info2) info2,max(info3) info3,max(info4) info4 
from (
select number1,stuff1,stuff2,null data1,null data2,null data3,null data4,null data5,null info1, null info2, null info3, null info4
from t1
union
select number1,null stuff1, null stuff2,data1,data2,data3,data4,data5,null info1, null info2, null info3, null info4
from t2
union
select number1,null stuff1, null stuff2,null data1,null data2,null data3,null data4,null data5,info1, info2, info3, info4
from t3) x
group by x.number1;

結果是:

+---------+--------+--------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
| number1 | stuff1 | stuff2 | data1 | data2 | data3 | data4 | data5 | info1 | info2 | info3 | info4 |
+---------+--------+--------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
| 1       | x      | y      | NULL  | NULL  | NULL  | NULL  | NULL  | j     | k     | l     | m     |
| 2       | NULL   | NULL   | a     | b     | c     | d     | e     | NULL  | NULL  | NULL  | NULL  |
| 3       | NULL   | NULL   | NULL  | NULL  | NULL  | NULL  | NULL  | j     | k     | l     | m     |
+---------+--------+--------+-------+-------+-------+-------+-------+-------+-------+-------+-------+

引用自:https://dba.stackexchange.com/questions/207121