协助 MySQL 左外连接和区分同一键的查询结果
Assistance with MySQL left outer join and differentiating query results from same key
我正在尝试了解 SQL 连接并尝试将它们应用到我正在构建的应用程序中。我正在查询以根据特定游戏 ID 按计划查找 "game record"。但是在这个游戏记录上;对于 "h_team" 和 "v_team";比赛记录中只有球队的 id。所以我想做的是加入 "teams" table 并查找 "h_team" 和 "v_team" 的两个不同的 team_names。我还使用连接引入 "division name",因为只有部门 ID 存储在游戏记录中。我已经让这一切正常工作;除了我不知道如何分别获得 h_team 和 v_team 的 "team_name" 结果。基本上每一个的关键就是"team_name";我将粘贴我的代码,然后进一步解释:
$array_game_id6=32;
$sql = "SELECT * FROM playoff_schedule LEFT OUTER JOIN teams on playoff_schedule.h_team = teams.team_id || playoff_schedule.v_team = teams.team_id LEFT OUTER JOIN playoff_divisions on playoff_schedule.po_div_id = playoff_divisions.po_div_id WHERE tom_game_id=$array_game_id6";
foreach ($dbh->query($sql) as $resultsg39)
{
$h_team=$resultsg39[h_team];
$v_team=$resultsg39[v_team];
$po_div_id=$resultsg39[po_div_id];
$round=$resultsg39[round];
$game_id=$resultsg39[game_id];
$date=$resultsg39[date];
$timestamp=$resultsg39[timestamp];
$h_score=$resultsg39[h_score];
$v_score=$resultsg39[v_score];
$tom_game_id=$resultsg39[tom_game_id];
$h_name=$resultsg39[team_name];
$div_name=$resultsg39[playoff_name];
}
当我试图获取查询结果并将它们全部存储在不同的变量中时,问题就出现了……
最后两个“$h_name”和“$div_name”正在从 JOIN 中拉出,所有之前的都在游戏记录本身中……
我想做的是将 "v_team" 和 "h_team" 中的名称存储在各自的变量 $h_name 和 $v_name 中;
我用它存储 $h_name 没问题;但我不知道如何让它分别存储 $h_name 和 $v_name,因为它们都是 "teams" table 的 "team_name" 列中的值。所以我只需要以某种方式做到这一点,这样当我得到结果时,它就可以分辨出两个不同的 "team_names" 之间的区别,并且我可以将它们存储在两个不同的变量中……
如果不清楚请告诉我。
谢谢!
***** 更新 10:49pm 美国东部时间 2/5/2015
在这方面取得了一些进展,但我的查询不起作用;我认为这是别名的问题,这是不对的;这是我现在的非工作查询:
$sth = $dbh->prepare("SELECT home_team.team_name as home_team_name, visiting_team.team_name as visiting_team_name,
h_team, v_team, po_div_id, round, game_id, date, timestamp, h_score, v_score, tom_game_id, playoff_name FROM playoff_schedule
LEFT OUTER JOIN teams as home_team on playoff_schedule.h_team = teams.team_id
LEFT OUTER JOIN teams as visiting_team on playoff_schedule.v_team = teams.team_id
LEFT OUTER JOIN playoff_divisions on playoff_schedule.po_div_id = playoff_divisions.po_div_id
WHERE tom_game_id=$array_game_id6");
$sth->execute();
$article_list = $sth->fetchAll(PDO::FETCH_ASSOC);
foreach ($article_list as $row => $link) {
$h_team=$link['h_team'];
$v_team=$link['v_team'];
$po_div_id=$link['po_div_id'];
$round=$link['round'];
}
如果有人能发现我的新查询有问题,我将不胜感激!
我认为你想做的是:
select home_team.team_name as home_team_name,
visiting_team.team_name as visiting_team_name
from playoff_schedule
join team as home_team on playoff_schedule.h_team = teams.team_id
join team as visiting_team on playoff_schedule.v_team = teams.team_id
您可以多次加入同一个 table。在这种情况下,这是有道理的,因为您确实在尝试获取两种不同的信息。
根据您上次的编辑,以下查询似乎有效:
SELECT home_team.team_name AS home_team_name,
visiting_team.team_name AS visiting_team_name,
h_team,
v_team,
playoff_schedule.po_div_id,
round,
game_id,
date,
timestamp,
h_score,
v_score,
tom_game_id,
playoff_name
FROM playoff_schedule
LEFT OUTER JOIN teams AS home_team
ON playoff_schedule.h_team = home_team.team_id
LEFT OUTER JOIN teams AS visiting_team
ON playoff_schedule.v_team = visiting_team.team_id
LEFT OUTER JOIN playoff_divisions
ON playoff_schedule.po_div_id = playoff_divisions.po_div_id
WHERE tom_game_id=$array_game_id6
您可以在以下位置检查查询和架构:SQLFiddle
可能发生的几件事:
- 查询本身是 运行ning 吗?
- 如果您 运行 在 mySQL 客户端中查询会怎样?
- 您的日志中是否有任何 PHP 错误?
- 你能post架构本身吗?
- $array_game_id6实际上是一个数值数组吗?在这种情况下,您需要在 where 子句中使用 "in" 而不是“=”。
关于您更新的查询,我认为您缺少的主要内容是在 JOIN 条件中使用别名。您应该在整个查询过程中保持 table 别名一致。另外,IMO 最好保持 table 别名简短,这样它们更容易阅读:
所以将这些应用到您的查询中:
SELECT h.team_name as h_team_name, v.team_name as v_team_name, s.h_team, s.v_team, s.po_div_id, s.round, s.game_id, s.date, s.timestamp, s.h_score, s.v_score, s.tom_game_id, s.playoff_name
FROM playoff_schedule s
LEFT OUTER JOIN teams h ON (
s.h_team = h.team_id
)
LEFT OUTER JOIN teams as v ON (
s.v_team = v.team_id
)
LEFT OUTER JOIN playoff_divisions d ON (
s.po_div_id = d.po_div_id
)
WHERE s.tom_game_id = ?
现在我不是 100% 确定您的架构,所以我可能引用了一些错误的列 table 但您应该能够解决这个问题。
我正在尝试了解 SQL 连接并尝试将它们应用到我正在构建的应用程序中。我正在查询以根据特定游戏 ID 按计划查找 "game record"。但是在这个游戏记录上;对于 "h_team" 和 "v_team";比赛记录中只有球队的 id。所以我想做的是加入 "teams" table 并查找 "h_team" 和 "v_team" 的两个不同的 team_names。我还使用连接引入 "division name",因为只有部门 ID 存储在游戏记录中。我已经让这一切正常工作;除了我不知道如何分别获得 h_team 和 v_team 的 "team_name" 结果。基本上每一个的关键就是"team_name";我将粘贴我的代码,然后进一步解释:
$array_game_id6=32;
$sql = "SELECT * FROM playoff_schedule LEFT OUTER JOIN teams on playoff_schedule.h_team = teams.team_id || playoff_schedule.v_team = teams.team_id LEFT OUTER JOIN playoff_divisions on playoff_schedule.po_div_id = playoff_divisions.po_div_id WHERE tom_game_id=$array_game_id6";
foreach ($dbh->query($sql) as $resultsg39)
{
$h_team=$resultsg39[h_team];
$v_team=$resultsg39[v_team];
$po_div_id=$resultsg39[po_div_id];
$round=$resultsg39[round];
$game_id=$resultsg39[game_id];
$date=$resultsg39[date];
$timestamp=$resultsg39[timestamp];
$h_score=$resultsg39[h_score];
$v_score=$resultsg39[v_score];
$tom_game_id=$resultsg39[tom_game_id];
$h_name=$resultsg39[team_name];
$div_name=$resultsg39[playoff_name];
}
当我试图获取查询结果并将它们全部存储在不同的变量中时,问题就出现了……
最后两个“$h_name”和“$div_name”正在从 JOIN 中拉出,所有之前的都在游戏记录本身中……
我想做的是将 "v_team" 和 "h_team" 中的名称存储在各自的变量 $h_name 和 $v_name 中;
我用它存储 $h_name 没问题;但我不知道如何让它分别存储 $h_name 和 $v_name,因为它们都是 "teams" table 的 "team_name" 列中的值。所以我只需要以某种方式做到这一点,这样当我得到结果时,它就可以分辨出两个不同的 "team_names" 之间的区别,并且我可以将它们存储在两个不同的变量中……
如果不清楚请告诉我。
谢谢!
***** 更新 10:49pm 美国东部时间 2/5/2015 在这方面取得了一些进展,但我的查询不起作用;我认为这是别名的问题,这是不对的;这是我现在的非工作查询:
$sth = $dbh->prepare("SELECT home_team.team_name as home_team_name, visiting_team.team_name as visiting_team_name,
h_team, v_team, po_div_id, round, game_id, date, timestamp, h_score, v_score, tom_game_id, playoff_name FROM playoff_schedule
LEFT OUTER JOIN teams as home_team on playoff_schedule.h_team = teams.team_id
LEFT OUTER JOIN teams as visiting_team on playoff_schedule.v_team = teams.team_id
LEFT OUTER JOIN playoff_divisions on playoff_schedule.po_div_id = playoff_divisions.po_div_id
WHERE tom_game_id=$array_game_id6");
$sth->execute();
$article_list = $sth->fetchAll(PDO::FETCH_ASSOC);
foreach ($article_list as $row => $link) {
$h_team=$link['h_team'];
$v_team=$link['v_team'];
$po_div_id=$link['po_div_id'];
$round=$link['round'];
}
如果有人能发现我的新查询有问题,我将不胜感激!
我认为你想做的是:
select home_team.team_name as home_team_name,
visiting_team.team_name as visiting_team_name
from playoff_schedule
join team as home_team on playoff_schedule.h_team = teams.team_id
join team as visiting_team on playoff_schedule.v_team = teams.team_id
您可以多次加入同一个 table。在这种情况下,这是有道理的,因为您确实在尝试获取两种不同的信息。
根据您上次的编辑,以下查询似乎有效:
SELECT home_team.team_name AS home_team_name,
visiting_team.team_name AS visiting_team_name,
h_team,
v_team,
playoff_schedule.po_div_id,
round,
game_id,
date,
timestamp,
h_score,
v_score,
tom_game_id,
playoff_name
FROM playoff_schedule
LEFT OUTER JOIN teams AS home_team
ON playoff_schedule.h_team = home_team.team_id
LEFT OUTER JOIN teams AS visiting_team
ON playoff_schedule.v_team = visiting_team.team_id
LEFT OUTER JOIN playoff_divisions
ON playoff_schedule.po_div_id = playoff_divisions.po_div_id
WHERE tom_game_id=$array_game_id6
您可以在以下位置检查查询和架构:SQLFiddle
可能发生的几件事:
- 查询本身是 运行ning 吗?
- 如果您 运行 在 mySQL 客户端中查询会怎样?
- 您的日志中是否有任何 PHP 错误?
- 你能post架构本身吗?
- $array_game_id6实际上是一个数值数组吗?在这种情况下,您需要在 where 子句中使用 "in" 而不是“=”。
关于您更新的查询,我认为您缺少的主要内容是在 JOIN 条件中使用别名。您应该在整个查询过程中保持 table 别名一致。另外,IMO 最好保持 table 别名简短,这样它们更容易阅读:
所以将这些应用到您的查询中:
SELECT h.team_name as h_team_name, v.team_name as v_team_name, s.h_team, s.v_team, s.po_div_id, s.round, s.game_id, s.date, s.timestamp, s.h_score, s.v_score, s.tom_game_id, s.playoff_name
FROM playoff_schedule s
LEFT OUTER JOIN teams h ON (
s.h_team = h.team_id
)
LEFT OUTER JOIN teams as v ON (
s.v_team = v.team_id
)
LEFT OUTER JOIN playoff_divisions d ON (
s.po_div_id = d.po_div_id
)
WHERE s.tom_game_id = ?
现在我不是 100% 确定您的架构,所以我可能引用了一些错误的列 table 但您应该能够解决这个问题。