[英]combine results on many sql queries without using cartesian join
如何組合多個選擇查詢的結果,以便我可以在一個組合視圖中獲得有關所有戰斗的信息。 有關完整的架構,請查看此處,因為 stackoverflow 限制了我可以編寫多少代碼來描述我的問題。
|battle.id |Attackers | Defender | Winner |
--------------------------------------------------------------------
| 1 |'rishabhchauhan'|'vaibhavchauhan' |'vaibhavchauhan'|
| 2 |'abhishekgaur' |'vaibhavchauhan' |'vaibhavchauhan'|
| 3 |'AnkitSharma' |'vaibhavchauhan' |'vaibhavchauhan'|
....
查詢以查找攻擊者名稱:
select CONCAT(player.firstname, player.lastname) as Attacker, Battles.battle_id
from ((player inner
join Attacker_Battles on Attacker_Battles.player_id = player.player_id )
inner join Battles on Battles.battle_id = Attacker_Battles.battle_id);
查詢以查找防御者姓名:
select CONCAT(player.firstname, player.lastname) as Defenders, Battles.battle_id
from ((player inner
join Defender_Battles on Defender_Battles.player_id = player.player_id )
inner join Battles on Battles.battle_id = Defender_Battles.battle_id);
查詢中獎者姓名:
select CONCAT(player.firstname, player.lastname) as Winners, Battles.battle_id
from ((player inner
join Winner_battles on Winner_battles.player_id = player.player_id )
inner join Battles on Battles.battle_id = Winner_battles.battle_id);
要將所有查詢合並為一個,您只需要將Battles
表JOIN
到每個Attacker_Battles
等表中,然后將每個表加入到player
表中以獲得適當的名稱。 這樣的事情應該工作:
SELECT CONCAT(pa.firstname, pa.lastname) AS Attacker,
CONCAT(pd.firstname, pd.lastname) AS Defender,
CONCAT(pw.firstname, pw.lastname) AS Winner,
b.battle_id As Battle
FROM Battles b
JOIN Attacker_Battles ab ON ab.battle_id = b.battle_id
JOIN player pa ON pa.player_id = ab.player_id
JOIN Defender_Battles db ON db.battle_id = b.battle_id
JOIN player pd ON pd.player_id = db.player_id
JOIN Winner_Battles wb ON wb.battle_id = b.battle_id
JOIN player pw ON pw.player_id = wb.player_id
輸出(用於您的 pastebin 數據)
Attacker Defender Winner Battle
rishabhchauhan vaibhavchauhan vaibhavchauhan 1
abhishekgaur pawanyadav abhishekgaur 2
abhishekgaur pawanyadav abhishekgaur 3
AnkitSharma JayantVerma AnkitSharma 4
vaibhavchauhan JayantVerma JayantVerma 5
rishabhchauhan abhishekgaur rishabhchauhan 6
vaibhavchauhan AnkitSharma vaibhavchauhan 8
查詢也可以寫成(也許更直觀一點)如下。 如果給定的Battle
可能沒有Attacker
、 Defender
和Winner
,則此查詢中的頂級JOIN
可以替換為LEFT JOIN
:
SELECT CONCAT(pa.firstname, pa.lastname) AS Attacker,
CONCAT(pd.firstname, pd.lastname) AS Defender,
CONCAT(pw.firstname, pw.lastname) AS Winner,
b.battle_id As Battle
FROM Battles b
JOIN (Attacker_Battles ab
JOIN player pa ON pa.player_id = ab.player_id) ON ab.battle_id = b.battle_id
JOIN (Defender_Battles db
JOIN player pd ON pd.player_id = db.player_id) ON db.battle_id = b.battle_id
JOIN (Winner_Battles wb
JOIN player pw ON pw.player_id = wb.player_id) ON wb.battle_id = b.battle_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.