【问题标题】:How to select from a table and up to two other items如何从表格和最多两个其他项目中进行选择
【发布时间】:2015-10-21 20:56:16
【问题描述】:

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

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 将为空)

我想运行一个选择查询:

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为空的情况为例,结果中的值应该为空。

从这个设置中获得这种结果的好的 SQL 查询是什么?

【问题讨论】:

  • 你试过什么?我希望有人不只是给你答案。你应该发布你的尝试。这里提示您要运行 select 语句并左连接表,以便您可以获取值(如果它们存在或为空)。

标签: mysql sql


【解决方案1】:

players 表作为您要查询的主表开始。正如其他人所说,您将要在匹配的外键上将 LEFT JOIN 其他表添加到 players 表。

如果您不确定要使用哪种联接类型,请查看此处:http://www.techonthenet.com/oracle/joins.php

该页面适用于 Oracle DB,但同样的概念适用于所有类型的 SQL。

【讨论】:

    【解决方案2】:

    您需要为武器和盾牌分别对itemsitem_types 表进行LEFT JOIN。使用表别名来区分您引用的是哪个联接。

    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
    

    【讨论】:

      【解决方案3】:
      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多