这是我的第一篇文章,但我已经在这里读了很多年,并且收集了很多很棒的信息。
当我试图解释我的困境时,请耐心等待。我甚至不确定如何标记我的问题,因为我真的不知道我正在尝试做什么的术语。我是PHP / MySQL的初学者(当你看到我的问题时,这将变得非常明显),但我渴望学习。
无论如何,这里是:
我有两个名为Games
和Teams
的表。
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.homeTeam
和Games.awayTeam
在Teams.id
和Teams.team
字段中查找其值。基本上Games.homeTeam
应该在Teams.id
中找到它的等价物。很简单。但是,我希望Games.homeTeam
和Games.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语句应该是什么样子来实现我想要的。
答案 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 JOIN
或RIGHT 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'];
我认为习惯于决定表格及其列的前缀