2017-07-18 39 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