2013-04-23 114 views
0

我有一个表命名为球员SQL如何INNER JOIN多个值类似字段名

p_id | first | last 
======================== 
1 | Michael | Jordan 
2 | Charles | Barkley 
3 | Kobe  | Bryant 
4 | Allen | Iverson 
5 | Kevin | Garnett 

然后,我有一个名为表用户

u_id | user | player_1 | player_2 | player_3 
============================================ 
1 | John | 1  | 2  | 5 
2 | Jane | 3  | 4  | 5 
3 | Jim | 2  | 3  | 4 

通过对一种形式网站,用户选择他们的球员(领域:player_1,player_2,player_3对应的ID为玩家

我试图运行一个INNER JOIN,我从用户表和他们的球员选择打印用户(第一,最后)

到目前为止,我有这个

SELECT * FROM users 
INNER JOIN players p1 ON player_1 = p1.player_id     
INNER JOIN players p2 ON player_2 = p2.player_id     
INNER JOIN players p3 ON player_3 = p3.player_id     
INNER JOIN players p4 ON player_4 = p4.player_id     
INNER JOIN players p5 ON player_5 = p5.player_id     
ORDER BY data"; 

当我跑

while ($row = mysql_fetch_assoc($result_users)) 
{ 
$player_1_first = $row['player_name'];  
$player_1_last = $row['player_last']; 

echo $player_1_first." ".$player_2_last; 
} 

我只得到用户的最后选择。

我的任务: 我如何才能正确地做到我想达到的目标?

+1

在一个侧面说明,你可能要在数据库标准化阅读起来。我发现你的用户表存在潜在的问题。 – 2013-04-23 16:33:25

+1

你应该改进你的模式,并有一个'users_players'表和'userid | playerid'领域。 – Ejaz 2013-04-23 16:33:41

+0

感谢您的建议@AbeMiessler! – 2013-04-23 16:40:10

回答

0

这里是一个可能的解决方案:

SELECT users.*, p1.player_id AS player1_id, p2.player_id AS player2_id, p3.player_id AS player3_id, p4.player_id AS player4_id, p5.player_id AS player5_id FROM users 
INNER JOIN players p1 ON player_1 = p1.player_id     
INNER JOIN players p2 ON player_2 = p2.player_id     
INNER JOIN players p3 ON player_3 = p3.player_id     
INNER JOIN players p4 ON player_4 = p4.player_id     
INNER JOIN players p5 ON player_5 = p5.player_id     
ORDER BY data"; 

在你的PHP代码,你当然会通过他们的名字选择字段,因为它们是SELECT子句中的“重命名”。

但是你也应该修改你的数据库模式,因为一个好的模式不会有这个问题。

0

如果我明白你是什么后(你真的不说了),你需要改变选择要求输出你想 所以

SELECT users.FieldsYouWant, 
p1.first as p1first, p1.last as p1last, 
p2.first as p2first, p2.last as p2last, 
p3.first as p3first, p3.last as p3last, 
p4.first as p4first, p4.last as p4last, 
p5.first as p5first, p5.last as p5last 
FROM users 
INNER JOIN players p1 ON player_1 = p1.player_id     
INNER JOIN players p2 ON player_2 = p2.player_id     
INNER JOIN players p3 ON player_3 = p3.player_id     
INNER JOIN players p4 ON player_4 = p4.player_id     
INNER JOIN players p5 ON player_5 = p5.player_id     
ORDER BY data"; 

然后在您的输出中读取所有5名单行 注意的是,如果用户不具有5名球员入选,你会得到什么