【问题标题】:How do you reference multiple lookups from the same table?如何从同一个表中引用多个查找?
【发布时间】:2012-09-27 13:05:04
【问题描述】:

这是我的第一篇文章,但我在这里阅读了很长时间,吸收了很多重要信息。

请耐心等待我试图解释我的困境。我什至不确定如何给我的问题贴上标签,因为我真的不知道我正在尝试做什么的术语。我是 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.awayTeam 字段在 Teams.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 语句应该是什么样子才能完成我想要的。

【问题讨论】:

  • 澄清你的确切问题是什么, $row['ht.team'] 应该是 $row['team'] ... PHP 抱怨你传递的密钥,“ht.team " 数组中不存在。如果您想更好地查看 mysql_fetch_array() 返回的内容,请执行 print_r($row); .. 从那里你会看到@Michael Berkowski 的回答是解决你困境的好方法。

标签: php mysql sql join alias


【解决方案1】:

不要将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

【讨论】:

  • 简直太棒了解释!闪电也快!荣誉。
【解决方案2】:

我认为问题是 你只给表一个别名,而不是列
如果 Games 表中没有名称为 team 的列 你可以在你的循环中调用它只有

$row['team'];

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

然后你可以达到每个团队任期

$row['htTeam']
and $row['gTeam'];

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    相关资源
    最近更新 更多