三つのテーブルをつなぐ肝腎の SQL文

忘れない内に残しておきましょう というのも、インターネット上には誤った SQL文が堂々と upload公開されていたりするのですから・・・

まずはテーブルの定義です

CREATE TABLE `man_tbls` (
	`id` INT( 11 ) NOT NULL AUTO_INCREMENT,
	`sirname` VARCHAR( 100 ) NOT NULL DEFAULT '',
	`firstname` VARCHAR( 100 ) NOT NULL DEFAULT '',
	`is_male` BOOLEAN NOT NULL DEFAULT '1',
	`birthdate` DATE NOT NULL DEFAULT '0000-00-00',
	PRIMARY KEY (`id`),
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci AUTO_INCREMENT=0;

CREATE TABLE `disease_tbls` (
	`id` INT( 11 ) NOT NULL AUTO_INCREMENT,
	`diagnosis` VARCHAR( 100 ) NOT NULL DEFAULT '',
	PRIMARY KEY (`id`),
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci AUTO_INCREMENT=0;

CREATE TABLE `relation_tbls` (
	`id` INT( 11 ) NOT NULL AUTO_INCREMENT,
	`man_tbl_id` INT( 11 ) NOT NULL DEFAULT '0',
        `disease_tbl_id` INT( 11 ) NOT NULL DEFAULT '0',
	PRIMARY KEY (`id`),
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci AUTO_INCREMENT=0;

この SQL文により、MySQLデータベース・エンジンにより三つのテーブルが作成されます 本当はこのデータベースに対して、さっき記述したデータを入力しておいて下さると助かりますが・・・

さて、このようなデータベース、これは実は 二つの固有テーブルを「関係テーブル」で結びつける「多」対「多」関係のデータなのですが、この中から、ある人が、ある病気にかかっている、ということを記述する SQL文は次のようになります

SELECT `M`.`id`,  `M`.`sirname`, `M`.`firstname`, `M`.`is_male`, `M`.`birthdate`,`D`.`disease
FROM `man_tbls` AS `M` INNER JOIN(`relation_tbls` AS `R` INNER JOIN  `disease_tbls` AS `D` ON `D`.`id` = 
`R`.`disease_tbl_id`  ) ON `M`.`id` = `R`.`man_tbl_id`;

結構複雑でしょ?

投稿者: (KAMAKURA & SAPPORO)Dr_Radialist

Expert Interventional Cardiologist and Amateur Computer Programmer

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です