簡體   English   中英

協助MySQL左外部聯接並從同一鍵中區分查詢結果

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

我正在嘗試了解SQL聯接,並嘗試將它們應用於正在構建的應用程序。 我正在查詢以根據特定的游戲ID在時間表上查找“游戲記錄”。 但是在這個游戲記錄上; 用於“ h_team”和“ v_team”; 游戲記錄中只有團隊的ID。 因此,我想做的就是加入“團隊”表,並查找“ h_team”和“ v_team”的兩個不同的team_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”表中“ team_name”列中的值。 所以我只需要以某種方式做到這一點,以便當我得到結果時,它可以告訴兩個不同的“ team_names”之間的區別,並且可以將它們存儲在兩個不同的變量中……

如果不清楚,請告訴我。

謝謝!

*****更新時間:美國東部標准時間2015年2月5日10:49 pm取得了一些進展,但我的查詢無法正常工作; 我認為別名有問題,這是不對的。 這是我目前無法使用的查詢:

$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

您可以根據需要多次加入同一張表。 在這種情況下,這很有意義,因為您實際上是在嘗試獲取兩個不同的信息。

根據您的上一次編輯,以下查詢似乎有效:

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

可能會發生的幾件事:

  • 查詢本身在運行嗎?
  • 如果在mySQL客戶端中運行查詢會怎樣?
  • 您的日志中是否有任何PHP錯誤?
  • 您可以發布架構本身嗎?
  • $ array_game_id6實際上是一個值數組嗎? 在這種情況下,您需要在where子句中使用“ in”而不是“ =”。

關於更新的查詢,我認為您缺少的主要內容是在JOIN條件中使用別名。 您應在整個查詢中保持表別名的一致性。 另外,IMO最好使表別名簡短,以便於閱讀:

因此,將這些內容應用於您的查詢:

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%正確,因此我可能已經將某些列引用到錯誤的表中,但是您應該可以對它們進行整理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM