简体   繁体   中英

Assistance with MySQL left outer join and differentiating query results from same key

I am trying to learn about SQL joins and trying to apply them to an application I am building. I am doing a query to find a "game record" on a schedule based on a specific game id. But on this game record; for the "h_team" and the "v_team"; only the ids of the teams are on the game record. And so what I want to do is join the "teams" table and look up the two different team_names of the "h_team" and "v_team". I have it also pull in a "division name" as well using a join since only the division id is stored on the game record. I have gotten this all to work fine; except I do not know how to get the results separately for the "team_name" for h_team and v_team. Basically the key for each one is just "team_name"; I will paste in my code and then explain further:

$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];
}

the problem comes in when i am trying to get the results of the query and store them all in the different variables…

the last two "$h_name" and "$div_name" are being pulled from the JOINs all the prior ones are on the game record itself…

what I want to do is store both the names from "v_team" and "h_team" in the respective variables $h_name and $v_name;

I have it storing the $h_name no problem; but i do not know how to make it store both $h_name and $v_name separately as they are both values in the column "team_name" from "teams" table. So I just need to somehow make it so when i get my results it can tell the difference between the two different "team_names" and I can store them in the two different variables…

If this is not clear please let me know.

Thanks!

***** UPDATE 10:49pm EST 2/5/2015 have made some progress on this but my query is not working; I think it is a problem with the aliases and such are not right; here is my non-working query as it is right now:

$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'];
}

if anyone can spot a problem with my new query I would really appreciate it!

I think what you are trying to do is:

  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

You can join to the same table as many times as you want to. In this case, it makes sense, because you really are trying to get two different bits of information.

Based on your last edit, the following query appears to work:

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

You can check the query and the schema at: SQLFiddle

A couple of thing that might be happening:

  • Is the query itself running?
  • What happens if you run the query in a mySQL client?
  • Are there any PHP errors in your log?
  • Could you post the schema itself?
  • Is $array_game_id6 actually an array of values? In that case, you need to use "in" as opposed to "=" in your where clause.

With regard to your updated query, I think the main thing you are missing is using the aliases in your JOIN conditions. You should keep your table aliases consistent throughout your query. Also, IMO its better to keep table aliases short so they are easier to read:

So applying those things to your query:

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 = ?

Now I'm not 100% sure of your schema so I may have referenced some of the columns to the wrong table but you should be able to sort that out.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM