在我的数据库中,我有三个表(不要问为什么它是这样设置的,它只是,这是一个简化但是遇到了问题):
Table: players
id
username
weapon_id
shield_id
Table: items
id
name
stats (either attack or defend stats number)
item_type_id
Table: item_types
id
is_weapon (true if weapon, false if shield)
is_rare (true/false boolean)
每位玩家没有任何物品,1件物品或2件物品。 (武器,盾牌,两者或两者都没有,在这种情况下,weapon_id和shield_id将为null)
我想运行一个获取的选择查询:
Results of my query
id (of player)
username
weapon_id
weapon_name
weapon_stats
weapon_is_rare
shield_id
shield_name
shield_stats
shield_is_rare
例如,在shield_id为null的情况下,结果中的值应该为null。
从这种设置中得到这种结果有什么好的SQL查询?
答案 0 :(得分:2)
从players
表开始,作为您要查询的主表。正如其他人所说的那样,您希望LEFT JOIN
其他表到匹配的外键上的players
表。
如果您不确定要使用哪种联接类型,请查看此处:http://www.techonthenet.com/oracle/joins.php
该页面适用于Oracle DB,但同样的概念适用于所有类型的SQL。
答案 1 :(得分:0)
SELECT
p.id
,p.username
,p.weapon_id
,i1.name AS weapon_name
,i1.stats AS weapon_stats
,i1.is_rare AS weapon_is_rare
,p.shield_id
,i2.name AS shield_name
,i2.stats AS shield_stats
,i2.is_rare AS shield_is_rare
FROM players p
LEFT JOIN (SELECT i.id, i.name, i.stats, it.is_rare
FROM items i
JOIN item_types it
ON i.item_type_id = it.id) AS i1
ON p.weapon_id = i1.id
LEFT JOIN (SELECT i.id, i.name, i.stats, it.is_rare
FROM items i
JOIN item_types it
ON i.item_type_id = it.id) AS i2
ON p.shield_id = i2.id;
答案 2 :(得分:0)
您需要分别为LEFT JOIN
和items
表执行item_types
武器和盾牌。使用表别名来区分您引用的连接。
SELECT
p.id
,p.username
,p.weapon_id
,w.name AS weapon_name
,w.stats AS weapon_stats
,wt.is_rare AS weapon_is_rare
,p.shield_id
,s.name AS shield_name
,s.stats AS shield_stats
,st.is_rare AS shield_is_rare
FROM players AS p
LEFT JOIN items AS w ON w.id = p.weapon_id
LEFT JOIN item_types AS wt ON wt.id = w.item_type_id
LEFT JOIN items AS s ON s.id = p.shield_id
LEFT JOIN item_types AS st ON st.id = s.item_type_id