我有3张桌子。
- 只有id和名称的用户表。
- 带有身份证,姓名和主题的学生表。
- student_enrolled表,现在为空。
醇>
我想找到'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'); */
-- ----------------
感谢您的帮助!
答案 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
字段。
修改强>
您可以使用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`);