2017-04-04 40 views
0

我試圖獲得屬於活動玩家的頭像以及電子郵件以「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

1. 「我有這個,但它不工作。」什麼不工作? 2.「以電子郵件開始的玩家」。我在查詢中的任何地方都沒有看到這樣的標準。 3. NAME存在於AVATAR和PLAYER中。你不想告訴DBMS你想展示哪一個? –

+0

有沒有原因讓你加入表格而不是用'EXISTS'或'IN'查找玩家? –

+0

一個玩家可以有多個頭像,每個頭像可以被多個玩家使用。但是你只想顯示頭像的名字,對吧?如果一個頭像被兩個活躍玩家使用,你想顯示一次或兩次的頭像名稱? –

回答

0

你可以做這樣的事情:

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%' ; 

在您要選擇獨特的頭像名稱情況下,你可以使用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%' ; 
0

您有錯誤,因爲列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' 
0

可以使用

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) 
+0

謝謝你的工作。你是一個拯救生命的人。 –

+0

這與@Satish的答案相同(你只添加了別名)... – PawelCz

+0

@HamidHosseini:如果這有效,請檢查答案的正確性 –

0

從我們簡要討論您的要求的註釋部分它變得清楚你的數據模型並不符合要求。你說一個頭像只屬於一個玩家。因此,將player_id存儲在頭像記錄中並丟棄橋表。

 
+-----------+--------------------+-----+--+---+--+ 
| PLAYER |     |  | | | | 
+-----------+--------------------+-----+--+---+--+ 
| PLAYER_ID | NUMBER(38,0)  | No | | 1 | | 
| NAME  | VARCHAR2(500 BYTE) | Yes | | 2 | | 
| ...  |     |  | | | | 
+-----------+--------------------+-----+--+---+--+ 

+-----------+--------------------+-----+--+---+--+ 
| AVATAR |     |  | | | | 
+-----------+--------------------+-----+--+---+--+ 
| AVATAR_ID | NUMBER(38,0)  | No | | 1 | | 
| NAME  | VARCHAR2(500 BYTE) | Yes | | 2 | | 
| PLAYER_ID | NUMBER(38,0)  | No | | 3 | | 
| ...  |     |  | | | | 
+-----------+--------------------+-----+--+---+--+ 

查詢變爲:

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