我的JOIN有什么问题?

时间:2015-09-26 21:12:47

标签: mysql join

所以我对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);

2 个答案:

答案 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在怪物表中为空,也使用左外连接。