Как получить все объекты по исходному ключу MySQL?

#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 , если вам в конечном итоге понадобятся также занятия без учеников 🙂