用于连接三个表和PHP的SQL代码

时间:2012-01-13 05:32:55

标签: php sql

我有三张桌子,我希望能够有一个HTML选择选项,显示播放器的名称及其能够播放的主要和次要位置。 Player表只将它们存储为整数而不是它们的所谓。我创建了一个查找表,将数字转换为实际位置,例如“C”=“1”。当我运行下面的SQL Query时,它不会在我的数组中显示任何内容。

  Player
  Player_ID  PrimaryPosition  SecondaryPosition   PlayerName
  1          2                1                   Bob           
  2          1                3                   Billy           


  Team
  Player_ID  TeamID  TeamName
  1          1       Hobos
  2          1       Rejects



  PosLookup
  PosNbr     PosLabel  PosLabel2
  1          C         C
  2          P         P
  3          1B        1B


  SELECT Player.PlayerName, PosLookup.PosLabel, PosLookup.PosLabel2, Player.Player_ID FROM Team, Player, PosLookup WHERE Player.Player_ID = Team.Player_ID and Team.TeamID = '1' and PosLookup.PosNbr = Player.PrimaryPosition and PosLookup.PosNbr = Player.SecondaryPosition ORDER BY PosLabel ASC


  foreach($rowarray as $row)
  {
  echo "<option value = $row[PlayerID] >$row[PlayerName] $row[PosLabel] $row[PosLabel2]</option>";
  $cntr++;
  }



  Desired OUTPUT Dropdown
  Bob P C
  Billy C 1B

2 个答案:

答案 0 :(得分:2)

查看查询中的一个条件:

PosLookup.PosNbr = Player.PrimaryPosition 
AND PosLookup.PosNbr = Player.SecondaryPosition

所以(例如Bob)你要求PosNbr为2(Bob的主要位置)和PosNbr为1(Bob的次要位置)的行。 这是不可行的,因为单个PosNbr不能同时为1和2。

此外,PosLabel2表中不需要PosLookup列(如果它只是PosLabel的克隆)。

如果您只想要一张基本上为Player的表格,并在PrimaryPositionSecondaryPosition中替换标签,并在Player_ID中替换名称(并过滤{ {1}})尝试:

TeamID

现在使用

SELECT Player.Player_ID, Player.PlayerName, p1.PosLabel, p2.PosLabel AS PosLabel2
FROM Player
LEFT JOIN PosLookup p1 ON Player.PrimaryPosition=p1.PosNbr
LEFT JOIN PosLookup p2 ON Player.SecondaryPosition=p2.PosNbr
LEFT JOIN Team ON Team.Player_ID = Player.Player_ID
WHERE Team.TeamID=1;

+-----------+------------+----------+-----------+
| Player_ID | PlayerName | PosLabel | PosLabel2 |
+-----------+------------+----------+-----------+
|         1 | Bob        | P        | C         |
|         2 | Billy      | C        | 1B        |
+-----------+------------+----------+-----------+

答案 1 :(得分:0)

试试这个:

SELECT 
    p.PlayerName, l1.PosLabel  , l2.PosLabel    
FROM 
    Player p, Team t 
LEFT JOIN PosLookup l1 on p.PrimaryPosition = l1.PrimaryPosition,   
LEFT JOIN PosLookup l2 on p.SecondaryPosition = l2.SecondaryPosition,   
WHERE 
    p.TeamID = t.TeamID
    t.TeamID = '1'