簡體   English   中英

同一兩個表上的兩個聯接

[英]two joins on same two tables

我有這兩張桌子。 我想加入這兩個表和real_name從我的player有桌子playerAplayerB在我的match表。 所以我嘗試了這個。 不幸的是,當我嘗試此操作時,我的比賽從46k記錄增加到超過一百萬條記錄,因此我知道這不能正常工作。

SELECT players.player_id, players.real_name, matches.playerA, matches.playerB, matches.scoreA, matches.scoreB
  FROM players
  JOIN matches ON players.player_id = matches.playerA
  JOIN matches m1 ON players.player_id = m1.playerB;

+----------+---------+---------+
| match_id | playerA | playerB |
+----------+---------+---------+
|        1 |       4 |      55 |
|        2 |       2 |      41 |
|        3 |      21 |      41 |
|        4 |       3 |       2 |
|        5 |      41 |       2 |
|        6 |      21 |       3 |
|        7 |       1 |       8 |
|        8 |       1 |       8 |
|        9 |       8 |      19 |
|       10 |      19 |      12 |
+----------+---------+---------+

+-----------+-----------------+
| player_id | real_name       |
+-----------+-----------------+
|         1 | Dong Nyoung Lee |
|         2 | Hyun Woo Jang   |
|         3 | Seung Hyun Lee  |
|         4 | Soo Ho Park     |
|         5 | Lee Sak Won     |
|         6 | Young Suh Yoon  |
|         7 | Yoon Jong Jung  |
|         8 | Dong Hwan Kim   |
|         9 | Tae Hoon Kwon   |
|        10 | Ilyes Satouri   |
+-----------+-----------------+

我添加了要求的內容。

+-----------+------------------------------------+---------+---------+--------+--------+
| player_id | real_name                          | playerA | playerB | scoreA | scoreB |
+-----------+------------------------------------+---------+---------+--------+--------+
|         4 | Soo Ho Park                        |       4 |      55 |      1 |      3 |
|         4 | Soo Ho Park                        |       4 |      55 |      1 |      3 |
|         4 | Soo Ho Park                        |       4 |      55 |      1 |      3 |
|         4 | Soo Ho Park                        |       4 |      55 |      1 |      3 |
|         4 | Soo Ho Park                        |       4 |      55 |      1 |      3 |
|         4 | Soo Ho Park                        |       4 |      55 |      1 |      3 |
|         4 | Soo Ho Park                        |       4 |      55 |      1 |      3 |
|         4 | Soo Ho Park                        |       4 |      55 |      1 |      3 |
|         4 | Soo Ho Park                        |       4 |      55 |      1 |      3 |
|         4 | Soo Ho Park                        |       4 |      55 |      1 |      3 |
|         4 | Soo Ho Park                        |       4 |      55 |      1 |      3 |
|         4 | Soo Ho Park                        |       4 |      55 |      1 |      3 |
|         4 | Soo Ho Park                        |       4 |      55 |      1 |      3 |
|         4 | Soo Ho Park                        |       4 |      55 |      1 |      3 |
|         4 | Soo Ho Park                        |       4 |      55 |      1 |      3 |
|         4 | Soo Ho Park                        |       4 |      55 |      1 |      3 |

如果您打算排行/匹配,我相信您想要的是這樣的:

SELECT p1.player_id, p1.real_name, p2_player_id, p2_player_name, 
     m.scoreA, m.scoreB
FROM matches m
JOIN players p1 ON p1.player_id = m.playerA
JOIN players p2 ON p2.player_id = m.playerB

照原樣,對於表“ match”中的每個配對,您將獲得每個參與比賽的玩家1的行乘以每個參與比賽的運動員2的行。

顯示以前運行的查詢以及要顯示的數據將很有幫助。

您的查詢當前正在做的是,對於每個玩家,從他們作為玩家A的每個比賽中加載行,然后從他們作為玩家B的每個比賽中加載行。由於SQL不會“排隊”這兩個聯接,而是交叉乘以它們(即生成它們的每種組合),您可能會為每個玩家ID生成許多行。

如果您要查找的是具有參與者全名和分數的匹配ID表,則該表看起來更像這樣:

select m.match_id, pA.full_name, m.scoreA, pB.full_name, m.scoreB from matches m join players pA on pA.player_id = m.playerA join players pB on pB.player_id = m.playerB

暫無
暫無

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

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