MYSQL:如何从姓氏中找到player_id?

时间:2010-02-27 18:16:13

标签: mysql join

我现在正试图使用​​来自未规范化“摘要”表的数据填充我的'testMatch'表(下方):

TESTMATCH TABLE


+------------------+--------------+------+-----+---------+-------+
| Field            | Type         | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+-------+
| match_id         | int(11)      | NO   | PRI | NULL    |       | 
| match_date       | date         | YES  |     | NULL    |       | 
| ground           | varchar(50)  | YES  | MUL | NULL    |       | 
| homeTeam         | varchar(100) | YES  | MUL | NULL    |       | 
| awayTeam         | varchar(100) | YES  | MUL | NULL    |       | 
| matchResult      | varchar(100) | YES  | MUL | NULL    |       | 
| manOfMatch       | varchar(30)  | YES  |     | NULL    |       | 
| homeTeam_captain | int(10)      | YES  | MUL | NULL    |       | 
| homeTeam_keeper  | int(10)      | YES  | MUL | NULL    |       | 
| awayTeam_captain | int(10)      | YES  | MUL | NULL    |       | 
| awayTeam_keeper  | int(10)      | YES  | MUL | NULL    |       | 
+------------------+--------------+------+-----+---------+-------+

填充match_id没有问题-----> manOfMatch - 它是'homeTeam_captain','homeTeam_keeper','awayTeam_captain'和'awayTeam_keeper',我遇到了问题。

摘要表


mysql> DESCRIBE SUMMARY;
+-----------------+--------------+------+-----+---------+-------+
| Field           | Type         | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+-------+
| matchID         | int(11)      | NO   | PRI | NULL    |       | 
| Test            | int(11)      | YES  |     | NULL    |       | 
| matchDate       | date         | YES  |     | NULL    |       | 
| Ground          | varchar(50)  | YES  |     | NULL    |       | 
| HomeTeam        | varchar(100) | YES  |     | NULL    |       | 
| AwayTeam        | varchar(100) | YES  |     | NULL    |       | 
| matchResult     | varchar(50)  | YES  |     | NULL    |       | 
| MarginRuns      | int(11)      | YES  |     | NULL    |       | 
| MarginWickets   | int(11)      | YES  |     | NULL    |       | 
| ManOfMatch      | varchar(40)  | YES  |     | NULL    |       | 
| HomeTeamCaptain | varchar(30)  | YES  |     | NULL    |       | 
| HomeTeamKeeper  | varchar(30)  | YES  |     | NULL    |       | 
| AwayTeamCaptain | varchar(30)  | YES  |     | NULL    |       | 
| AwayTeamKeeper  | varchar(30)  | YES  |     | NULL    |       | 
+-----------------+--------------+------+-----+---------+-------+

我需要以某种方式从摘要中选择数据,获取相应的player_id并将player_id输入到我的'testMatch'中。玩家表格如下:

球员表


mysql> describe players;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| player_id      | int(11)      | NO   | PRI | NULL    | auto_increment | 
| player_surname | varchar(30)  | YES  |     | NULL    |                | 
| team           | varchar(100) | YES  | MUL | NULL    |                | 
+----------------+--------------+------+-----+---------+----------------+

所以要澄清一下,例如。我想选择homeTeam_captain数据FROM摘要表但不是名字,我想要相应的player_id。

我假设我需要使用某种连接/子查询来完成这个...我尝试选择:


select matchID, player_id, player_surname, team from players p, summary s
where
s.hometeamcaptain = p.player_surname ORDER BY matchID;

但这会带回73行,应该只有65行(65场比赛)。

我希望这是有道理的,谢谢你的帮助!! 颖

1 个答案:

答案 0 :(得分:1)

名称是否重叠?如果是这样,也要确保团队对应(将s.HomeTeam = p.team添加到where块)。如果一个团队中有同名的玩家,则必须手动解决这些冲突。

要一次选择 all 守护者/队长,您需要left outer joins。我猜这将是每个玩家一次加入,所以你必须加入同一张桌子4次。

选择正确的数据后,您可以使用INSERT ... SELECT将其插入testMatch表。