1

これは私の最初の投稿ですが、私はここで多くの素晴らしい情報を取り入れて何年にもわたって読んでいます.

私の苦境を説明しようとしていますので、ご容赦ください。私がやろうとしていることの用語を本当に知らないので、質問にどのようにラベルを付けるかさえわかりませんでした. 私は PHP/MySQL の初心者です (これは私の質問を見ると痛々しいほど明白になります) が、熱心に学びたいと思っています。

とにかく、ここに行きます:

と という名前の 2 つのテーブルがGamesありTeamsます。

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.homeTeamフィールドとフィールドでGames.awayTeam値のルックアップを行いたいと思います。基本的には で同等のものを見つける必要があります。十分に単純です。ただし、同じ SQL ステートメント内でと の両方をテーブルで調べたいと思います。Teams.idTeams.teamGames.homeTeamTeams.idGames.homeTeamGames.awayTeamTeams

私はおそらくこのようなものがうまくいくだろうと考えました:

$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 ステートメントがどのように見えるべきかについて頭を悩ませることはできません。

4

2 に答える 2

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
于 2012-09-27T13:08:41.367 に答える
0

問題は、テーブルのみにエイリアスを付けることであり
、Games テーブルに team という名前の列がない場合は、ループ内でのみ呼び出すことができる列ではないと思います

$row['チーム'];

ただし、両方のテーブルにチームのような同じ名前の列がある場合は、これを行う必要があります。 select ht.team as htTeam , g.team as gTeam Teams ht inner join Games on ht.Id = ..... から

その後、各チームの用語に到達できます

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

テーブルとその列の接頭辞を決めるのに慣れると思います

于 2012-09-27T13:09:21.880 に答える