在连接查询中多次引用来自相同 table 的记录?

Referencing records from the same table multiple times in a join query?

我决定在几个 table 中存储有关我正在制作的游戏的信息,但我 运行 遇到了一个问题:我游戏中的每个项目最多可以具有三个能力,这上的限制很少。这会导致在尝试加入 tables 并显示能力名称时出现问题。

我正在使用 MySQL 服务器,我创建了一个视图,它将项目的所有信息组合成一个巨大的 table。问题是如果一个item有3个不同的能力,不满足view的where条件

这里是对这个问题有重要意义的 table 个定义(还有比这个更多的 table):

CREATE TABLE items_misc (
Item_ID INT(4) NOT NULL,
Item_Hash INT(4) NOT NULL UNIQUE,
Ability_One INT(4),
Ability_Two INT(4),
Ability_Three INT(4),
element_id INT(2) NOT NULL,
PRIMARY KEY(Item_ID),
INDEX(Item_Hash),
FOREIGN KEY(Item_ID) REFERENCES items_names(IID),
FOREIGN KEY(Ability_One) REFERENCES item_abilities(AID),
FOREIGN KEY(Ability_Two) REFERENCES item_abilities(AID),
FOREIGN KEY(Ability_Three) REFERENCES item_abilities(AID),
FOREIGN KEY(element_id) REFERENCES element_types(EID)
);

CREATE TABLE item_abilities(
AID INT(4) NOT NULL,
Name VARCHAR(30) NOT NULL UNIQUE,
Description VARCHAR(99) NOT NULL,
PRIMARY KEY(AID)
);

然后是我的 CREATE VIEW 语句的 WHERE 子句:

WHERE items_names.IID = items_stats.Item_ID AND
items_names.IID = items_misc.Item_ID AND
item_types.TID = items_stats.type_id AND
element_types.EID = items_misc.element_id AND
item_abilities.AID = items_misc.Ability_One AND
item_abilities.AID = items_misc.Ability_Two AND
item_abilities.AID = items_misc.Ability_Three;

如何更改连接条件或 tables 以说明每个项目可能具有来自同一能力池的三种不同能力(即能力顺序无关紧要)这一事实?

如果您想从 item_abilities 中获取三种能力中每一种的值,那么您需要在 from 子句中引用 item_abilities 三次:

FROM items_names,
     items_stats,
     items_misc,
     item_types,
     element_types,
     item_abilities item_abilities1,
     item_abilities item_abilities2,
     item_abilities item_abilities3
WHERE items_names.IID = items_stats.Item_ID AND
items_names.IID = items_misc.Item_ID AND
item_types.TID = items_stats.type_id AND
element_types.EID = items_misc.element_id AND
item_abilities1.AID = items_misc.Ability_One AND
item_abilities2.AID = items_misc.Ability_Two AND
item_abilities3.AID = items_misc.Ability_Three;

顺便说一句,强烈建议您使用 SQL-1999 连接而不是在 where 子句中连接:

FROM items_names
     JOIN items_stats ON items_names.IID = items_stats.Item_ID
     JOIN items_misc ON items_names.IID = items_misc.Item_ID
     JOIN item_types ON item_types.TID = items_stats.type_id
     JOIN element_types ON element_types.EID = items_misc.element_id
     JOIN item_abilities item_abilities1
          ON item_abilities1.AID = items_misc.Ability_One
     JOIN item_abilities item_abilities2
          ON item_abilities2.AID = items_misc.Ability_Two
     JOIN item_abilities item_abilities3
          ON item_abilities3.AID = items_misc.Ability_Three;