2017-07-18 56 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>'; 
     }; 

?> 

現在JOIN查詢我想出來的基礎上東西我在網上看了是這樣的:

$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>'; 
} 

編輯1:

從中你不要以後使用是可選的SQL語句中的列。所以,如果您以後不需要它們,則不需要選擇所有列。

也許您也正在成爲alcali表的NULL值的行。這意味着並不是所有的專輯都有圖像。然後,您必須向我們提供您在表格中的價值,以便我們可以爲您提供適當的WHERE條件,如WHERE ali IS NOT NULL。我的這個答案只是你的起點。

編輯2:

這個版本也沒關係。我只是改變了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你非常歡迎。我寫(並刪除),你甚至可以刪除表'albumimages',並將圖像'路徑'移動到'專輯'。所以你可以留在一張桌子上:'專輯'。但是,如果您確實想分開收集圖像集合,則可能會出錯,從中您可以根據需要選擇圖像。或者可能不是,然後將「路徑」保存爲「專輯」表中的專輯詳細信息是有意義的。實際上,您的決定基於您的願景和使用情況。祝你好運! – 2017-07-18 04:05:33