2012-09-27 61 views
1

這是我的第一篇文章,但我一直在這裏閱讀很多很多很棒的信息。如何引用同一個表中的多個查找?

當我試圖解釋我的困境時,請耐心等待。我甚至不知道如何標記我的問題,因爲我不知道我正在嘗試做什麼的術語。我是PHP/MySQL的初學者(當你看到我的問題時,這會變得非常明顯),但我渴望學習。

無論如何,這裏有雲:

我有兩個表,命名爲GamesTeams

mysql> describe games; 

+-----------+---------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-----------+---------------+------+-----+---------+----------------+ 
| id  | int(11)  | NO | PRI | NULL | auto_increment | 
| homeTeam | int(11)  | NO |  | NULL |    | 
| awayTeam | int(11)  | NO |  | NULL |    | 
| homeScore | int(11)  | NO |  | NULL |    | 
| awayScore | int(11)  | NO |  | NULL |    | 
| homeOdds | decimal(10,2) | NO |  | NULL |    | 
| drawOdds | decimal(10,2) | NO |  | NULL |    | 
| awayOdds | decimal(10,2) | NO |  | NULL |    | 
| gameDate | date   | NO |  | NULL |    | 
+-----------+---------------+------+-----+---------+----------------+ 

mysql> describe teams; 

+-------+--------------+------+-----+---------+----------------+ 
| Field | Type   | Null | Key | Default | Extra   | 
+-------+--------------+------+-----+---------+----------------+ 
| id | int(11)  | NO | PRI | NULL | auto_increment | 
| team | varchar(255) | NO |  | NULL |    | 
+-------+--------------+------+-----+---------+----------------+ 

我想等領域Games.homeTeamGames.awayTeam爲他們在Teams.idTeams.team字段的值進行查找。基本上Games.homeTeam應該在Teams.id找到它的等價物。夠簡單。但是,我希望Games.homeTeamGames.awayTeam在同一個SQL語句內的Teams表中查找。

我想也許這樣的事情會的工作:

$result = mysql_query("SELECT * FROM Games g, Teams ht, Teams at where g.homeTeam = ht.id AND g.awayTeam = at.id ORDER BY g.gameDate") or die(mysql_error()); 

,然後挑行了:

while($row = mysql_fetch_array($result)) { echo "Home Team: " . $row['ht.team'];} 

這是一個沒有去,因爲我得到一個MySQL錯誤說沒有指數名爲ht.team

我希望這很清楚我想在這裏實現什麼。我應該怎麼做呢?我假設我必須使用某種類型的別名,但是我無法將自己的頭圍繞在SQL語句應該看起來像完成我想要的東西上。

+0

澄清你確切的問題是什麼,$ row ['ht.team']應該是$ row ['team'] ... PHP抱怨你通過的密鑰「ht.team」doesn陣列中不存在。如果你想更好地看看mysql_fetch_array()返回什麼,請執行print_r($ row); ..從那裏你會看到@Michael Berkowski的回答是解決你的困境的一個很好的方法。 –

回答

2

請勿使用SELECT *加入查詢!始終明確你在SELECT列表需要的列,並提供列別名:

SELECT 
    /* Only select the columns you actually need, and 
    * supply aliases to those with similar names 
    */ 
    ht.team AS ht_team, 
    ht.id AS ht_id, 
    at.team AS at_team, 
    at.id AS at_id 
    g.homeScore, 
    g.awayScore, 
    g.homeOdds, 
    g.drawOdds, 
    g.awayOdds, 
    g.gameDate 
FROM 
    Games g, 
    Teams ht, 
    Teams at 
where g.homeTeam = ht.id AND g.awayTeam = at.id 
ORDER BY g.gameDate 

在你的PHP,通過它們的別名訪問它們,例如:

echo "Home Team: {$row['ht_team']}"; 

順便說一句,雖然您的隱式方法(在WHERE子句中逗號分隔的表和條件)聯接將會工作,通常建議使用顯式聯接。它是一種新的語法,並允許更容易擴展到LEFT JOINRIGHT JOIN在有需要時:

SELECT 
    ht.team AS ht_team, 
    ht.id AS ht_id, 
    at.team AS at_team, 
    at.id AS at_id 
    g.homeScore, 
    g.awayScore, 
    g.homeOdds, 
    g.drawOdds, 
    g.awayOdds, 
    g.gameDate 
FROM 
    /* Explicit JOIN syntax */ 
    Games g, 
    JOIN Teams ht ON g.homeTeam = ht.id 
    JOIN Teams at ON g.awayTeam = at.id 
ORDER BY g.gameDate 
+0

簡單真棒解釋!閃電也是如此!榮譽。 – user1703238

0

我認爲這個問題是 你給一個別名錶只,不列
如果有不是遊戲名單中的一列,名稱爲 ,您可以在您的循環中將其稱爲

$ row ['team'];

但是,如果兩個表具有相同的名稱列像團隊 所以你應該這樣做。 select ht.team as htTeam , g.team as gTeam從小組HT內部聯接 遊戲ht.Id = .....

然後你就可以用

$row['htTeam'] 
and $row['gTeam']; 

達到每隊學期,我認爲習慣決定表的前綴和他們的列

相關問題