简体   繁体   English

同一两个表上的两个联接

[英]two joins on same two tables

I have these two tables. 我有这两张桌子。 I would like to join the two tables and the real_name from my player table with playerA and playerB in my match table. 我想加入这两个表和real_name从我的player有桌子playerAplayerB在我的match表。 So I tried this. 所以我尝试了这个。 Unfortunately when I tried this my matches went from 46k records to over a million records so I know this is not working correctly. 不幸的是,当我尝试此操作时,我的比赛从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   |
+-----------+-----------------+

I added what was asked for. 我添加了要求的内容。

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

If your intent is to get a row/match, I believe what you want is something like: 如果您打算排行/匹配,我相信您想要的是这样的:

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

As it was, you were getting rows for each match player 1 participated in multiplied by every match player 2 participated in for each pairing in table 'match'. 照原样,对于表“ match”中的每个配对,您将获得每个参与比赛的玩家1的行乘以每个参与比赛的运动员2的行。

It would be helpful to show the query you were running before, as well as which data you want to display. 显示以前运行的查询以及要显示的数据将很有帮助。

What your query is currently doing is, for each player, loading rows from every match in which they were player A, then loading every match in which they were player B. Since SQL doesn't "line up" these two joins, but rather cross-multiplies them (ie generates every combination of them), you're likely generating many, many rows for every player id. 您的查询当前正在做的是,对于每个玩家,从他们作为玩家A的每个比赛中加载行,然后从他们作为玩家B的每个比赛中加载行。由于SQL不会“排队”这两个联接,而是交叉乘以它们(即生成它们的每种组合),您可能会为每个玩家ID生成许多行。

If what you're after is a table of match ids with the full names and scores of the participants, that would look more like this: 如果您要查找的是具有参与者全名和分数的匹配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