我有3张桌子。
- 一个用户表,仅包含一个ID和一个名称。
- 一个学生表,其中包含ID,名称和主题。
- 一个students_enrolled表,现在为空。
我想从“用户”表中查找与“学生”表中具有匹配项的所有表条目。为此,我有以下查询:
SELECT *
FROM students
WHERE name IN (SELECT name FROM users);
QUERY RESULTS:
id name
3 mark
4 steve
这可行,但是现在目标是使用此数据来伪造第三个表(“ students_enrolled”),并使ID与users表匹配。在用户表中,“标记”是ID 3,在“史蒂夫”中是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小提琴链接: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'); */
-- ----------------
谢谢您的帮助!
您可以使用一条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`);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句