2015-02-05 17 views
0

我想了解SQL連接並試圖將它們應用於我正在構建的應用程序。我正在查詢根據特定遊戲ID在計劃中查找「遊戲記錄」。但是在這個遊戲紀錄上;爲「h_team」和「v_team」;只有球隊的ID在比賽記錄上。所以我想要做的就是加入「團隊」表並查找「h_team」和「v_team」這兩個不同的team_name。因爲只有分區ID存儲在遊戲記錄中,所以我也使用加入來拉入「分區名稱」。我已經得到了這一切工作正常;除了我不知道如何分別獲取h_team和v_team的「team_name」的結果。基本上每個人的關鍵只是「team_name」;我會在我的代碼粘貼,然後進一步解釋:幫助MySQL左外連接和區分來自同一個鍵的查詢結果

$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」之間的差異,我可以將它們存儲在兩個不同的變量...

如果這不明確,請讓我知道。

謝謝!

***** UPDATE 10:49 pm EST 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']; 
} 

如果任何人都可以與我的新的查詢發現了一個問題,我將不勝感激!

回答

1

我認爲你正在試圖做的是:

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」而不是「=」。
+0

這仍然是有問題的ID,他沒有別名的列或使用數字索引提取模式,因爲這些鍵將在PHP端彼此覆蓋。需要像'select home_team.team_name as home_team_name,visiting_team.team_name as visiting_team_name' – prodigitalson 2015-02-05 23:32:37

+0

@prodigitalson - 我已經更新了答案。這不是完整的查詢無論如何 – 2015-02-05 23:34:27

+0

謝謝你們,我正在尋找這個,並渴望嘗試這個,想知道這個:我有「選擇*」之前,所以我可以只將所有的結果轉儲到變量;但如果我以這種方式編寫查詢,這是否意味着我必須單獨選擇每個關鍵字(只需在以逗號分隔列出的關鍵字之後添加它們),如下所示:select home_team.team_name as home_team_name,visit_team.team_name as visiting_team_name,h_team, v_team,h_score,v_score ...。等等? – 2015-02-06 00:06:01

1

關於您更新的查詢,我認爲您缺少的主要是在您的JOIN條件中使用別名。你應該保持你的表別名在你的查詢中保持一致。此外,國際海事組織它能夠更好地保持表的別名短,使他們更容易閱讀:

所以將這些東西到您的查詢:

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%確定您的架構,所以我可能已經將某些列引用到了錯誤的表中,但您應該能夠將其排除。

+0

謝謝prodigitalson;我昨晚嘗試了這個,但無法啓動它。我今天回到這裏;所以將分開看看有什麼作品,什麼不試圖「隔離」的問題... – 2015-02-06 16:01:58

+0

謝謝,拆散工作,我發現故障;非常感謝您的幫助 – 2015-02-06 16:21:53