首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在联接查询中多次引用同一表中的记录?

在联接查询中多次引用同一表中的记录?
EN

Stack Overflow用户
提问于 2015-01-30 21:37:12
回答 1查看 837关注 0票数 1

我决定把我正在制作的游戏的信息存储在几个表中,但是我遇到了一个问题:我的游戏中的每一项都可以有最多三种能力,这是几乎没有限制的。这将导致在试图连接表和显示能力名称时出现问题。

我正在使用MySQL服务器,我创建了一个视图,它将项目的所有信息合并到一个巨大的表中。问题是,如果一个项目有三种不同的能力,它就不符合视图的where条件。

以下是对此问题具有重要意义的表定义(有更多的表):

代码语言:javascript
复制
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语句的WHERE子句:

代码语言:javascript
复制
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;

如何更改联接条件或表,以说明每个项目可能具有来自同一能力池的三种不同能力(即能力顺序不重要)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-30 21:49:01

如果您希望从item_abilities中获得三种功能的值,则需要在from子句中引用三次item_abilities

代码语言:javascript
复制
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子句:

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28245033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档