【问题标题】:Get data using inner join on three tables在三个表上使用内连接获取数据
【发布时间】:2017-04-04 11:05:33
【问题描述】:

我正在尝试获取属于活跃玩家以及电子邮件以“a”开头的玩家的头像的名称。

SELECT NAME 
FROM AVATAR 
  INNER JOIN PLAYERAVATAR ON PLAYERAVATAR.PLAYER_ID = PLAYERAVATAR.AVATAR_ID 
  INNER JOIN PLAYER ON PLAYER.ACTIVE = 1;

我有这个,但它不起作用。我不是很擅长这个,所以任何帮助将不胜感激。谢谢你。

+-----------+--------------------+-----+--+---+--+
|  AVATAR   |                    |     |  |   |  |
+-----------+--------------------+-----+--+---+--+
| AVATAR_ID | NUMBER(38,0)       | No  |  | 1 |  |
| NAME      | VARCHAR2(500 BYTE) | Yes |  | 2 |  |
| DOB       | VARCHAR2(500 BYTE) | Yes |  | 3 |  |
| HOARD     | NUMBER(38,0)       | Yes |  | 4 |  |
| STRENGH   | NUMBER             | Yes |  | 5 |  |
| GENDER    | VARCHAR2(500 BYTE) | Yes |  | 6 |  |
| SPECIES   | VARCHAR2(500 BYTE) | Yes |  | 7 |  |
+-----------+--------------------+-----+--+---+--+

+-----------+--------------------+-----+--+---+--+
|  PLAYER   |                    |     |  |   |  |
+-----------+--------------------+-----+--+---+--+
| PLAYER_ID | NUMBER(38,0)       | No  |  | 1 |  |
| NAME      | VARCHAR2(500 BYTE) | Yes |  | 2 |  |
| EMAIL     | VARCHAR2(500 BYTE) | Yes |  | 3 |  |
| ACTIVE    | NUMBER(38,0)       | Yes |  | 4 |  |
| PASSWORD  | VARCHAR2(500 BYTE) | Yes |  | 5 |  |
+-----------+--------------------+-----+--+---+--+
+--------------+--------------+-----+--+---+--+
| PLAYERAVATAR |              |     |  |   |  |
+--------------+--------------+-----+--+---+--+
| PLAYER_ID    | NUMBER(38,0) | Yes |  | 1 |  |
| AVATAR_ID    | NUMBER(38,0) | Yes |  | 2 |  |
+--------------+--------------+-----+--+---+--+

【问题讨论】:

  • 1. “我有这个,但它不起作用。”究竟什么不起作用? 2.“邮件以a开头的玩家”。我在您的查询中没有看到这样的标准。 3. NAME 存在于 AVATAR 和 PLAYER 中。您不想告诉 DBMS 您要显示两者中的哪一个吗?
  • 您加入牌桌而不是使用EXISTSIN 查找玩家有什么原因吗?
  • 一个玩家可以有多个头像,每个头像可以被多个玩家使用。但是您只想显示头像名称,对吗?如果一个头像被两个活跃玩家使用,你想显示头像名称一次或两次?
  • 链接表是为了解决多对多的关系问题。一个玩家可以拥有多个头像,但一个头像不能被多个玩家拥有。
  • 但是每个头像1个玩家不是多对多,而是一对多。您应该删除您的网桥表PLAYERAVATAR 并将PLAYER_ID 添加到您的AVATAR 表中。因此,您可以保证一致性(一个头像只能属于一个玩家)并使您的查询更加简单。

标签: sql inner-join


【解决方案1】:

你可以使用

select a.NAME       from AVATAR   a
    join PLAYERAVATAR  pa on a.AVATAR_ID =pa.AVATAR_ID 
    join PLAYER   p on pa.PLAYER_ID    =p.PLAYER_ID   
    where p.ACTIVE = 1 and p.EMAIL     like 'a%'

如果你想要不同的头像名称,你可以使用

 select distinct(a.NAME)

【讨论】:

  • @HamidHosseini:如果这有效,请查看答案
【解决方案2】:

您有错误,因为name 列在多个表中。

你应该使用别名。

试试这个:

SELECT 
    P.NAME 
FROM 
    AVATAR A
INNER JOIN 
    PLAYERAVATAR PL ON PL.PLAYER_ID = A.PLAYER_ID
INNER JOIN 
    PLAYER P ON P.ACTIVE = 1 AND P.PLAYER_ID  = A.PLAYER_ID
WHERE 
    SUBSTR(P.EMAIL, 1, 1) = 'a'

【讨论】:

    【解决方案3】:

    你可以这样做:

    SELECT 
        AVATAR.NAME 
    FROM 
        AVATAR 
    INNER JOIN 
        PLAYERAVATAR ON PLAYERAVATAR.AVATAR_ID = AVATAR.AVATAR_ID 
    INNER JOIN 
        PLAYER ON PLAYER.PLAYER_ID = PLAYERAVATAR.PLAYER_ID
    WHERE 
        PLAYER.ACTIVE = 1
    AND 
        PLAYER.EMAIL LIKE 'a%' ;
    

    如果你想选择Unique Avatar Names,你可以使用DISTINCT,类似这样:

    SELECT DISTINCT
        AVATAR.NAME 
    FROM 
        AVATAR 
    INNER JOIN 
        PLAYERAVATAR ON PLAYERAVATAR.AVATAR_ID = AVATAR.AVATAR_ID 
    INNER JOIN 
        PLAYER ON PLAYER.PLAYER_ID = PLAYERAVATAR.PLAYER_ID
    WHERE 
        PLAYER.ACTIVE = 1
    AND 
        PLAYER.EMAIL LIKE 'a%' ;
    

    【讨论】:

      【解决方案4】:

      从我们在您的请求评论部分的简短讨论中可以清楚地看出,您的数据模型实际上并不符合要求。你说一个头像只属于一个玩家。所以将 player_id 存储在头像记录中并删除桥接表。

      +-----------+--------+-----+--+---+--+ |播放器 | | | | | | +-----------+--------+-----+--+---+--+ | PLAYER_ID |号码(38,0) |没有 | | 1 | | |姓名 | VARCHAR2(500 字节) |是 | | 2 | | | ... | | | | | | +-----------+--------+-----+--+---+--+ +-----------+--------+-----+--+---+--+ |阿凡达 | | | | | | +-----------+--------+-----+--+---+--+ | AVATAR_ID |号码(38,0) |没有 | | 1 | | |姓名 | VARCHAR2(500 字节) |是 | | 2 | | | PLAYER_ID |号码(38,0) |没有 | | 3 | | | ... | | | | | | +-----------+--------+-----+--+---+--+

      查询变为:

      select name
      from avatar
      where player_id in
      (
        select player_id
        from player
        where active = 1
        and email like 'a%'
      );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-07
        • 2014-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-03
        相关资源
        最近更新 更多