协助 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 但您应该能够解决这个问题。