如何从同一个表中引用多个查找?

时间:2012-09-27 13:05:04

标签: php mysql sql join alias

这是我的第一篇文章,但我已经在这里读了很多年,并且收集了很多很棒的信息。

当我试图解释我的困境时,请耐心等待。我甚至不确定如何标记我的问题,因为我真的不知道我正在尝试做什么的术语。我是PHP / MySQL的初学者(当你看到我的问题时,这将变得非常明显),但我渴望学习。

无论如何,这里是:

我有两个名为GamesTeams的表。

mysql> describe games;

+-----------+---------------+------+-----+---------+----------------+
| Field     | Type          | Null | Key | Default | Extra          |
+-----------+---------------+------+-----+---------+----------------+
| id        | int(11)       | NO   | PRI | NULL    | auto_increment |
| homeTeam  | int(11)       | NO   |     | NULL    |                |
| awayTeam  | int(11)       | NO   |     | NULL    |                |
| homeScore | int(11)       | NO   |     | NULL    |                |
| awayScore | int(11)       | NO   |     | NULL    |                |
| homeOdds  | decimal(10,2) | NO   |     | NULL    |                |
| drawOdds  | decimal(10,2) | NO   |     | NULL    |                |
| awayOdds  | decimal(10,2) | NO   |     | NULL    |                |
| gameDate  | date          | NO   |     | NULL    |                |
+-----------+---------------+------+-----+---------+----------------+

mysql> describe teams;

+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| team  | varchar(255) | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

我希望字段Games.homeTeamGames.awayTeamTeams.idTeams.team字段中查找其值。基本上Games.homeTeam应该在Teams.id中找到它的等价物。很简单。但是,我希望Games.homeTeamGames.awayTeam同时查看同一SQL语句中的Teams表。

我认为这样的事可能有用:

$result = mysql_query("SELECT * FROM Games g, Teams ht, Teams at where g.homeTeam = ht.id AND g.awayTeam = at.id ORDER BY g.gameDate") or die(mysql_error());

然后选择行:

while($row = mysql_fetch_array($result)) { echo "Home Team: " . $row['ht.team'];}

这是不行的,因为我收到一个mysql错误,说没有名为ht.team的索引。

我希望我很清楚我在这里想要实现的目标。我该怎么办呢?我假设我必须使用某种类型的别名,但我无法理解SQL语句应该是什么样子来实现我想要的。

2 个答案:

答案 0 :(得分:2)

不要将SELECT *用于加入查询!始终在SELECT列表中明确您需要的列,并提供列别名:

SELECT 
  /* Only select the columns you actually need, and 
   * supply aliases to those with similar names
   */
  ht.team AS ht_team,
  ht.id AS ht_id,
  at.team AS at_team,
  at.id AS at_id
  g.homeScore,
  g.awayScore,
  g.homeOdds,
  g.drawOdds,
  g.awayOdds,
  g.gameDate
FROM 
  Games g, 
  Teams ht, 
  Teams at 
where g.homeTeam = ht.id AND g.awayTeam = at.id 
ORDER BY g.gameDate

在PHP中,通过别名访问它们,例如:

echo "Home Team: {$row['ht_team']}";

顺便说一下,虽然隐式(WHERE子句中的逗号分隔表和条件)连接的方法可行,但通常建议使用显式连接。这是一种较新的语法,可以在需要时更轻松地扩展到LEFT JOINRIGHT JOIN

SELECT 
  ht.team AS ht_team,
  ht.id AS ht_id,
  at.team AS at_team,
  at.id AS at_id
  g.homeScore,
  g.awayScore,
  g.homeOdds,
  g.drawOdds,
  g.awayOdds,
  g.gameDate
FROM 
  /* Explicit JOIN syntax */
  Games g, 
  JOIN Teams ht ON g.homeTeam = ht.id 
  JOIN Teams at ON g.awayTeam = at.id 
ORDER BY g.gameDate

答案 1 :(得分:0)

我认为问题是 你只给表的别名,而不是列  如果Games表中没有名为team的列 你可以只用

在你的循环中调用它

$行[ '团队'];

但是,如果两个表都具有与团队相同的名称列 所以你应该这样做。   来自Teams的select ht.team as htTeam , g.team as gTeam内部加入 ht.Id = .....

的游戏

然后你可以用

来达到每个团队的任期
$row['htTeam']
and $row['gTeam'];

我认为习惯于决定表格及其列的前缀