如何从表格和最多两个其他项目中进行选择

时间:2015-10-21 20:56:17

标签: mysql sql

在我的数据库中,我有三个表(不要问为什么它是这样设置的,它只是,这是一个简化但是遇到了问题):

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查询?

3 个答案:

答案 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 JOINitems表执行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