【问题标题】:merge 2 mysql tables database合并2个mysql表数据库
【发布时间】:2023-04-02 06:11:01
【问题描述】:

我需要从table1 中选择所有active=1 并将t1cid,t2cid,L1cid,L2cid---L10cid 替换为table2 中对应的cid 名称。

我有两张桌子,

Table1 列名

id
name
t1cid
t2cid
L1cid
L2cid
L3cid
L4cid
L5cid
L6cid
L7cid
L8cid
L9cid
L10cid
active

表2

cid       
ctype    
cname

我需要合并这两个表并产生类似的输出,

决赛桌

id  
name 
t1cname  
t2cname 
L1cname  
L2cname  
L3cname  
L4cname 
L5cname 
L6cname
L7cname 
L8cname 
L9cname 
L10cname

【问题讨论】:

  • 你能告诉我们两个表合并的规则吗?
  • 了解SQL joins

标签: mysql select merge


【解决方案1】:

您可以多次 join Table2Table1,每列一次:

SELECT Table1.id,
       Table1.name,
       Table2_t1.cname  AS t1cname,
       Table2_t1.cname  AS t2cname,
       Table2_L1.cname  AS L1cname,
       Table2_L2.cname  AS L2cname,
       Table2_L3.cname  AS L3cname,
       Table2_L4.cname  AS L4cname,
       Table2_L5.cname  AS L5cname,
       Table2_L6.cname  AS L6cname,
       Table2_L7.cname  AS L7cname,
       Table2_L8.cname  AS L8cname,
       Table2_L9.cname  AS L9cname,
       Table2_L10.cname AS L10cname
FROM   Table1
  JOIN Table2 AS Table2_t1  ON Table2_t1.cid  = Table1.t1cid
  JOIN Table2 AS Table2_t2  ON Table2_t2.cid  = Table1.t2cid
  JOIN Table2 AS Table2_L1  ON Table2_L1.cid  = Table1.L1cid
  JOIN Table2 AS Table2_L2  ON Table2_L2.cid  = Table1.L2cid
  JOIN Table2 AS Table2_L3  ON Table2_L3.cid  = Table1.L3cid
  JOIN Table2 AS Table2_L4  ON Table2_L4.cid  = Table1.L4cid
  JOIN Table2 AS Table2_L5  ON Table2_L5.cid  = Table1.L5cid
  JOIN Table2 AS Table2_L6  ON Table2_L6.cid  = Table1.L6cid
  JOIN Table2 AS Table2_L7  ON Table2_L7.cid  = Table1.L7cid
  JOIN Table2 AS Table2_L8  ON Table2_L8.cid  = Table1.L8cid
  JOIN Table2 AS Table2_L9  ON Table2_L9.cid  = Table1.L9cid
  JOIN Table2 AS Table2_L10 ON Table2_L10.cid = Table1.L10cid
WHERE  Table1.active = 1

或者,您也可以加入表格一次,然后对结果进行分组:

SELECT   Table1.id,
         Table1.name,
         MAX(IF(Table1.t1cid =Table2.cid, Table2.cname, NULL)) AS t1cname,
         MAX(IF(Table1.t2cid =Table2.cid, Table2.cname, NULL)) AS t2cname,
         MAX(IF(Table1.L1cid =Table2.cid, Table2.cname, NULL)) AS L1cname,
         MAX(IF(Table1.L2cid =Table2.cid, Table2.cname, NULL)) AS L2cname,
         MAX(IF(Table1.L3cid =Table2.cid, Table2.cname, NULL)) AS L3cname,
         MAX(IF(Table1.L4cid =Table2.cid, Table2.cname, NULL)) AS L4cname,
         MAX(IF(Table1.L5cid =Table2.cid, Table2.cname, NULL)) AS L5cname,
         MAX(IF(Table1.L6cid =Table2.cid, Table2.cname, NULL)) AS L6cname,
         MAX(IF(Table1.L7cid =Table2.cid, Table2.cname, NULL)) AS L7cname,
         MAX(IF(Table1.L8cid =Table2.cid, Table2.cname, NULL)) AS L8cname,
         MAX(IF(Table1.L9cid =Table2.cid, Table2.cname, NULL)) AS L9cname,
         MAX(IF(Table1.L10cid=Table2.cid, Table2.cname, NULL)) AS L10cname
FROM     Table1 JOIN Table2 ON Table2.cid IN (
           Table1.t1cid,
           Table1.t2cid,
           Table1.L1cid,
           Table1.L2cid,
           Table1.L3cid,
           Table1.L4cid,
           Table1.L5cid,
           Table1.L6cid,
           Table1.L7cid,
           Table1.L8cid,
           Table1.L9cid,
           Table1.L10cid
         )
WHERE    Table1.active = 1
GROUP BY Table1.id

我认为第一个解决方案应该更快,特别是如果您在 Table2.cid 上有索引,在 Table1 中有外键列 - 但也许值得对这两种方法进行基准测试,看看哪个更好?

【讨论】:

    猜你喜欢
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    相关资源
    最近更新 更多