2017-07-18 17 views
0

私は3つのテーブルがあります。私の3テーブルJOIN MySQLクエリが機能しないのはなぜですか?

Table: album 
Columns: id, name, description, author, path, image 

Table: albumconnect 
Columns: id, imageid, albumid 

Table: albumimages 
Columns: id, path 

をそして私は、単一の結合問合せにすべてのそれらの不要なクエリを交換しようとしている:私は上のベースを作ってみたクエリを今すぐ登録しよう

<?php 

     $albumID = $_SERVER['QUERY_STRING']; 
     $realAlbumID = substr($albumID, 1); 
     $realestAlbumID = str_replace('%20', ' ', $realAlbumID); 

     $sql = "SELECT * FROM album WHERE id='$realestAlbumID'"; 
     $result = mysqli_query($conn, $sql); 
     $getResult = mysqli_fetch_assoc($result); 
     $albumPath = $getResult['path']; 

     $sql2 = "SELECT * FROM albumconnect WHERE albumid='$realestAlbumID'"; 
     $result2 = mysqli_query($conn, $sql2); 

     while ($row = $result2->fetch_assoc()){ 
      $imageId = $row['imageid']; 
      $sql3 = "SELECT * FROM albumimages WHERE id='$imageId'"; 
      $result3 = mysqli_query($conn, $sql3); 
      $getResult3 = mysqli_fetch_assoc($result3); 
      $imagePath = $getResult3['path']; 
      echo '<div class="imageContainerAlbums"><li class="listAlbums"><img class="specificAlbumThumnails" src="'.$albumPath.$imagePath.'" alt="Random image" /></li></div>'; 
     }; 

?> 

私がオンラインに読んだものはこれです:

しかし
$sql5 = "SELECT * FROM album 
       JOIN albumconnect ON albumconnect.albumid=album.id 
       JOIN albumimages ON albumimages.id=albumconnect.imageid 
       WHERE id='$realestAlbumID'"; 
     $result5 = mysqli_query($conn, $sql5); 

、私は内容をのvar_dumpしようとしたとき、私は私のクエリが間違っていると仮定して、それがヌル出力しますが、私はCを把握することはできませんそれを行うための正しい方法。

+0

PHPmyAdminなどの変数を使って直接クエリを試しましたか? – Difster

+0

はい、既にデータベースに値があります。 –

+0

つまり、SQLコマンドで直接クエリを実行し、結合が機能するかどうかを確認します。 – Difster

答えて

1

は次のようなものであるべき。私はそれをテストしなかった。 @Difsterが正しく言っているように、SQLエンジンはどちらがidを参照すべきか分からない。したがって、テーブルエイリアスを定義し、参照されたカラムの前に接頭辞を付けます。次に、列名のユニークなエイリアスも定義します。さもなければ、あなたのSQLステートメントはほぼ完璧でした。

<?php 

$albumID = $_SERVER['QUERY_STRING']; 
$realAlbumID = substr($albumID, 1); 
$realestAlbumID = str_replace('%20', ' ', $realAlbumID); 

$sql = "SELECT 
      alb.name AS album_name, 
      alb.description AS album_description, 
      alb.author AS album_author, 
      alb.path AS album_path, 
      alb.image AS album_image, 
      ali.path AS image_path 
     FROM album AS alb 
     LEFT JOIN albumconnect AS alc ON alc.albumid = alb.id 
     LEFT JOIN albumimages AS ali ON ali.id = alc.imageid 
     WHERE alb.id = '$realestAlbumID'"; 
$result = mysqli_query($conn, $sql); 

while ($row = $result->fetch_assoc()) { 
    $albumPath = $row['album_path']; 
    $imagePath = $row['image_path']; 
    echo '<div class="imageContainerAlbums">'; 
    echo '<li class="listAlbums">'; 
    echo '<img class="specificAlbumThumnails" src="' . $albumPath . $imagePath . '" alt="Random image" />'; 
    echo '</li>'; 
    echo '</div>'; 
} 

EDIT 1:あなたは後で使用していないSQL文から

列はオプションです。したがって、後で必要としない場合は、すべての列を選択する必要はありません。

また、alcまたはaliテーブルのNULL値を持つ行になることもあります。つまり、すべてのアルバムに画像があるわけではありません。次に、テーブルにある値を教えてください。WHERE ali IS NOT NULLのような適切なWHERE条件を提供することができます。この私の答えはあなたの出発点にすぎません。

EDIT 2:

このバージョンでもOKです。私はSQL文を変更しました。

<?php 

$albumID = $_SERVER['QUERY_STRING']; 
$realAlbumID = substr($albumID, 1); 
$realestAlbumID = str_replace('%20', ' ', $realAlbumID); 

$sql = "SELECT 
      alb.name AS album_name, 
      alb.description AS album_description, 
      alb.author AS album_author, 
      alb.path AS album_path, 
      alb.image AS album_image, 
      ali.path AS image_path 
     FROM albumimages AS ali 
     LEFT JOIN albumconnect AS alc ON alc.imageid = ali.id 
     LEFT JOIN album AS alb ON alb.id = alc.albumid 
     WHERE alb.id = '$realestAlbumID'"; 
$result = mysqli_query($conn, $sql); 

while ($row = $result->fetch_assoc()) { 
    $albumPath = $row['album_path']; 
    $imagePath = $row['image_path']; 
    echo '<div class="imageContainerAlbums">'; 
    echo '<li class="listAlbums">'; 
    echo '<img class="specificAlbumThumnails" src="' . $albumPath . $imagePath . '" alt="Random image" />'; 
    echo '</li>'; 
    echo '</div>'; 
} 
+0

これらの例のおかげで、JOINの使い方を多かれ少なかれ把握できました。また、仲介テーブルに関するあなたの質問は、私は実際にはそれが全く必要でないことを実感しました。有難うございます。 –

+0

@PeterAtanasovあなたは大歓迎です。テーブル 'アルバム画像 'も削除し、画像'パス 'を'アルバム'に移動することもできると書いていました(削除しました)。だから、あなたは一つのテーブル、「アルバム」にとどまることができます。しかし、あなたが実際に別々に画像コレクションを持っていたい場合には、おそらく間違っているでしょう。そこからあなたが望むように画像を選ぶことができます。そうでないかもしれないし、 'album'テーブルにアルバムの詳細として' path'というイメージを保存するのは意味があります。あなたのビジョンとユースケースに基づいて、実際にあなたの決定です。がんばろう! –

関連する問題