#mysql
#mysql
Вопрос:
Я новичок в БД, поэтому я даже не уверен, что это возможно. У меня есть две таблицы class
и students
CREATE TABLE `class` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL DEFAULT '0' COLLATE 'latin1_swedish_ci',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `name` (`name`) USING BTREE
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=2
;
CREATE TABLE `students` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`ref_class_id` INT(10) NOT NULL DEFAULT '0',
`name` VARCHAR(45) NULL DEFAULT NULL COLLATE 'latin1_swedish_ci',
PRIMARY KEY (`id`) USING BTREE,
INDEX `FK_students_class` (`ref_class_id`) USING BTREE,
CONSTRAINT `FK_students_class` FOREIGN KEY (`ref_class_id`) REFERENCES `testdata`.`class` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=3
;
затем вставьте
INSERT INTO `testdata`.`class` (`name`) VALUES ('foo');
INSERT INTO `testdata`.`students` (`ref_class_id`, `name`) VALUES ('2', 'student1');
INSERT INTO `testdata`.`students` (`ref_class_id`, `name`) VALUES ('2', 'student2');
Итак, на данный момент у меня есть 2 ученика, которые связаны с одним классом. Затем в моем коде на C # мне нужно как-то извлечь эти данные из БД, чтобы сделать это, я создал процедуру
CREATE DEFINER=`root`@`localhost` PROCEDURE `retrieve_class_by_id`(
IN `class_id` INT
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
SELECT * FROM class WHERE id=class_id;
END
Но я здесь, я не знаю, как идти дальше… На самом деле, я могу из кода получить объект класса, а затем получить всех учеников из таблицы, но мне интересно, возможно ли сделать это только в рамках одной процедуры?
Ответ №1:
Вы должны объединить две таблицы:
SELECT c.id, c.name, s.id, s.name
FROM class AS c
INNER JOIN students AS s ON (s.ref_class_id = c.id)
WHERE c.id = class_id;
Используйте a LEFT JOIN
, если вам в конечном итоге понадобятся также занятия без учеников 🙂