MySQL查询根据其他表中的多个列从1个表中获取多个值

时间:2013-03-31 17:14:38

标签: mysql

我有这个表结构(让我们称之为表teams):

id | player1 | player2 | player3
1  | 13      | 25      | 50

这个(我们称这个表为players):

id | pts
13 | 5
25 | 10
50 | 12

有没有办法编写一个查询来获取表pts中某一行的每个玩家的teams值?

例如,如果我想获得player1的pts值,我会做类似的事情:

select teams.id,players.pts from teams left join players on teams.player1=players.id

我需要同时为所有3名玩家做这件事(实际上,有18名玩家,而不是3名 - 但同样的原则应该有效。)

我知道我可以循环使用它们,但这似乎不是最佳解决方案。

3 个答案:

答案 0 :(得分:3)

我认为更好的想法是拥有以下结构:

小组

team_id | name
----------------
1       | Team 1
2       | Team 2
3       | Team 3

<强>玩家

player_id | pts
---------------
1         | 10
2         | 5
3         | 25

<强> teams_players_xrefs

team_id | player_id
-------------------
1       | 1
1       | 2
2       | 3

然后使用以下查询:

SELECT
  player_id,
  pts
FROM
  teams_players_xrefs
INNER JOIN
  players USING (player_id)
WHERE
  team_id = 1

获得以下结果:

player_id | pts
---------------
1         | 10
2         | 5

这是SQL Fiddle

答案 1 :(得分:1)

SELECT
  player1.pts AS player1_pts,
  player2.pts AS player2_pts,
  player3.pts AS player3_pts
FROM
  teams
  LEFT JOIN players AS player1 ON team.player1=player1.id
  LEFT JOIN players AS player2 ON team.player2=player2.id
  LEFT JOIN players AS player3 ON team.player3=player3.id
WHERE
   ...

答案 2 :(得分:1)

你可以为每个玩家加入players表,这样可行但不是一个理想的解决方案。不幸的是,由于你的桌面结构是你能做的最好的。

创建一个映射表,将团队与玩家联系起来会好得多。例如:

CREATE TABLE teams
(
  id INT,
  PRIMARY KEY(id)
 );

CREATE TABLE team_players
(
  team_id INT,
  player_id INT
)

这样您就可以通过team_id进行查询并轻松返回该团队中的所有玩家。