如何将MySQL数据合并到一个表中

时间:2015-10-02 17:32:03

标签: mysql insert

我有3张桌子。

  
      
  1. 只有id和名称的用户表。
  2.   
  3. 带有身份证,姓名和主题的学生表。
  4.   
  5. student_enrolled表,现在为空。
  6.   

我想找到'users'表中所有在'students'表中都有匹配项的表条目。为此,我有以下查询:

SELECT  *
FROM    students
WHERE   name  IN (SELECT name FROM users);

QUERY RESULTS:

id  name
3   mark
4   steve
  

这样可行,但现在目标是傀儡第三桌   ('students_enrolled')包含此数据,并且id与用户匹配   表。在用户表中,'mark'是ID 3,'steve'是ID 4,但是在   学生表分别是ID 50和99。我想要   将它们插入到'students_enrolled'表中,其中匹配ID为   用户表。 注意:'名称'将始终是唯一的 - 会有   永远不会在一张桌子里成为两个史蒂夫

The goal is to have the 'students_enrolled' table show this:

id  name    status  subject
3   mark    enrolled    math
4   steve   enrolled    reading

如果有人有任何想法,我已经创建了一个包含所有架构和数据的sqlfiddle:

[sql fiddle link to schema and data:http://sqlfiddle.com/#!9/c5ea5/1][1]

Schema:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

INSERT INTO `users` (`id`, `name`)
VALUES
    (1, 'john'),
    (2, 'jane'),
    (3, 'mark'),
    (4, 'steve');

-- ----------------

CREATE TABLE `students` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(25) DEFAULT NULL,
  `subject` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;


INSERT INTO `students` (`id`, `name`, `subject`)
VALUES
    (50, 'mark', 'math'),
    (99, 'steve', 'reading');


-- ----------------

CREATE TABLE `students_enrolled` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `status` varchar(255) DEFAULT NULL,
  `subject` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;


/* Desired result:*/
/* INSERT INTO `students_enrolled` (`id`, `name`, `status`, `subject`)
VALUES
    (3, 'mark', 'enrolled', 'math'),
    (4, 'steve', 'enrolled', 'reading'); */

-- ----------------
  

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以使用INSERT ... SELECT语句进行插入:

INSERT INTO `students_enrolled` (`id`, `name`, `status`, `subject`)
SELECT u.`id`, s.`name`, 'enrolled', s.`subject`
FROM `students` AS s
INNER JOIN `users` AS u ON s.`name` = u.`name`

您可以使用users.id来获取INNER JOIN字段。

Demo here

修改

您可以使用students_enrolled

过滤掉NOT EXISTS表格中现有的记录
INSERT INTO `students_enrolled` (`id`, `name`, `status`, `subject`)
SELECT u.`id`, s.`name`, 'enrolled', s.`subject`
FROM `students` AS s
INNER JOIN `users` AS u ON s.`name` = u.`name`
WHERE NOT EXISTS (SELECT 1 
                  FROM `students_enrolled` AS se
                  WHERE se.`id` = u.`id`);