如何将两个SQL表的数据合并到一个新的SQL表中?

时间:2018-08-18 02:32:43

标签: mysql

我正在从Joomla迁移到基于React的网站应用程序。我将需要从旧数据库的两个表中收集数据,以创建新数据库的一个表。

是否有工具,程序或方法来实现?

表1 在Joomla中,用户位于单独的表格中。该表(用户表)具有以下列:

id

name

username

email (there are a few more but I do not need them)

表2 用户的个人资料存储在我的Joomla网站上的另一个表中。表(配置文件表)中的列为:

user_id(same as id from table above)

online (Do not need)

validated (Do not need)

main_photo

status

gender

field_6

field_16

表3 =(表1 +表2) 我想将这两个表合并到一个新的MYSQL数据库中。合并后,我可以将数据库导入到新站点的SQL表中,它将包含旧站点中的所有用户数据。 新站点表的列为:

id (same as id from Table 1 and user_id from Table 2)

username (same as username from Table 1)

firstname (same as name from Table 1)

email (same as email from Table 1)

bio (same as status from Table 2)

instagram (new field - not in Table 1 or 2)

twitter (new field - not in Table 1 or 2)

gender (same as gender from table 2)

religion (same as field_6 from table 2)

age (same as field_16 from table 2)

2 个答案:

答案 0 :(得分:1)

CREATE TABLE Table3 AS 
(SELECT Table1.*, 
      Table2.*
 FROM   Table1
      INNER JOIN Table2
              ON Table1.id = Table2.user_id);

答案 1 :(得分:1)

您可以使用CREATE TABLE ... SELECT查询来执行此操作。要获取您命名的特定字段,可以使用以下查询:

CREATE TABLE table3 AS
SELECT id, username, name AS firstname, email, status AS bio,
    '' AS instagram, '' AS twitter, gender, field_6 AS religion,
    field_16 As age
FROM table1 t1
JOIN table2 t2 ON t2.user_id = t1.id

请注意,由于instagramtwitter字段没有值,因此需要重置它们的定义。 SHOW CREATE table3查询显示了问题:

CREATE TABLE `table3` ( `id` int(11) DEFAULT NULL,
    `username` varchar(20) DEFAULT NULL, 
    `firstname` varchar(20) DEFAULT NULL,
    `email` varchar(50) DEFAULT NULL, 
    `bio` varchar(100) DEFAULT NULL,
    `instagram` char(0) NOT NULL DEFAULT '',
    `twitter` char(0) NOT NULL DEFAULT '',
    `gender` varchar(1) DEFAULT NULL,
    `religion` varchar(20) DEFAULT NULL,
    `age` int(11) DEFAULT NULL )
    ENGINE=InnoDB DEFAULT CHARSET=utf8

您将需要ALTER TABLE命令为这些字段设置适当的定义,例如

ALTER TABLE table3 CHANGE instagram instagram VARCHAR(50), 
                   CHANGE twitter twitter VARCHAR(50);

请注意,列定义只是我所做的测试用例中的示例。您的将从现有表中复制。