所以我对MySQL非常陌生,我正在努力学习它的每一步。我应该创建一个小型数据库,可以为我的类分配做任何事情。我创建了表,但我想弄清楚如何正确地将它们连接在一起。
以下是我目前的代码:
CREATE TABLE `monster` (
`monster_id` INTEGER NULL AUTO_INCREMENT DEFAULT NULL,
`name` VARCHAR(30) NULL DEFAULT NULL,
`hitpoints` TINYINT NULL DEFAULT NULL,
`armorclass` TINYINT NULL DEFAULT NULL,
PRIMARY KEY (`monster_id`)
);
CREATE TABLE `monster_size` (
`monster_id` INTEGER NULL AUTO_INCREMENT DEFAULT NULL,
`size_id` INTEGER NULL DEFAULT NULL,
PRIMARY KEY (`monster_id`)
);
CREATE TABLE `size` (
`size_id` INTEGER NULL AUTO_INCREMENT DEFAULT NULL,
`size` VARCHAR(15) NULL DEFAULT NULL,
PRIMARY KEY (`size_id`)
);
ALTER TABLE `monster_size` ADD FOREIGN KEY (monster_id) REFERENCES `monster` (`monster_id`);
ALTER TABLE `monster_size` ADD FOREIGN KEY (size_id) REFERENCES `size` (`size_id`);
/* Here is where I am trying to get the joining to happen */
SELECT name,hitpoints,size
FROM monster m
JOIN size s ON (m.monster_id=s.size_id)
JOIN monster_size ms ON (s.size_id=ms.size_id);
答案 0 :(得分:1)
您没有以正确的方式加入表格。您希望将monster
表加入monster_size
联结表,然后将size
表加入monster_size
表,如下所示:
SELECT name,hitpoints,size
FROM monster m
JOIN monster_size ms ON m.monster_id = ms.monster_id
JOIN size s ON ms.size_id = s.size_id
在您当前的查询中,您尝试将size表中的id与来自monster表的id匹配,但这两个表没有任何直接关系,因此您需要使用{ {1}}表来连接它们。
答案 1 :(得分:0)
您正在使用关联表monster_size
。这意味着您正在创建m到n的关系。怪物真的可以同时拥有多种尺寸吗?因为现在,一个大小可以链接到几个怪物,但怪物也可以通过这个链接表链接到几个大小。
此链接表也不应该有自动增量列。
但可能你只想一次将一个尺寸与一个怪物联系起来。忘记monster_size
表。而是在size_id
表中添加monster
列(无自动增量)。可能无论如何都不会改变可能的大小集,所以你也可以在size
表中删除自动增量,并“手动”添加好定义ID。
新表格结构
DROP TABLE IF EXISTS `monster`;
CREATE TABLE `monster` (
`monster_id` INTEGER NULL AUTO_INCREMENT DEFAULT NULL,
`name` VARCHAR(30) NULL DEFAULT NULL,
`hitpoints` TINYINT NULL DEFAULT NULL,
`armorclass` TINYINT NULL DEFAULT NULL,
`size_id` INTEGER NULL DEFAULT NULL,
PRIMARY KEY (`monster_id`)
);
DROP TABLE IF EXISTS `size`;
CREATE TABLE `size` (
`size_id` INTEGER NULL DEFAULT NULL,
`size` VARCHAR(15) NULL DEFAULT NULL,
PRIMARY KEY (`size_id`)
);
ALTER TABLE `monster` ADD FOREIGN KEY (size_id) REFERENCES `size` (`size_id`);
INSERT INTO size (size_id, size) VALUES (1, 'small');
INSERT INTO size (size_id, size) VALUES (2, 'big');
INSERT INTO size (size_id, size) VALUES (3, 'huge');
INSERT INTO monster(name, hitpoints, size_id) VALUES ('Tester', 10, 1);
现在,您的查询就像这样
SELECT m.name, m.hitpoints, s.size
FROM
monster m
LEFT JOIN size s
ON (m.size_id = s.size_id);
如果size_id
在怪物表中为空,也使用左外连接。