簡體   English   中英

在不使用笛卡爾連接的情況下組合許多 sql 查詢的結果

[英]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);

要將所有查詢合並為一個,您只需要將BattlesJOIN到每個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

SQLFiddle 上的演示

查詢也可以寫成(也許更直觀一點)如下。 如果給定的Battle可能沒有AttackerDefenderWinner ,則此查詢中的頂級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

SQLFiddle 上的演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM