Zendie
Zendie

Reputation: 1174

merge 2 mysql tables database

I need to select all from table1 where active=1 and replace t1cid,t2cid,L1cid,L2cid---L10cid with corresponding name of cid in table2.

I have two tables like,

Table1 column names

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

Table2

cid       
ctype    
cname

I need to merge these two tables and produce the output like,

final table

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

Upvotes: 4

Views: 135

Answers (1)

eggyal
eggyal

Reputation: 125865

You could join Table2 to Table1 multiple times, once for each column:

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

Or, alternatively, you could join the tables once and then group the results:

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

I think the first solution ought to be faster, especially if you have indexes on Table2.cid and the foreign key columns in Table1—but perhaps it's worth benchmarking the two approaches to see which is better?

Upvotes: 0

Related Questions