为什么我的3表JOIN MySQL查询不起作用?
我有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正确的方式来做到这一点。
应该是这样的。我没有测试它。正如@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语句中的列。所以,如果您以后不需要它们,则不需要选择所有列。
也许您也正在成为alc
或ali
表的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>';
}
由于这些例子,我能够或多或少地掌握如何使用JOIN。此外,你关于中间表的问题让我意识到我实际上并不需要它。谢谢你。 –
@PeterAtanasov你非常欢迎。我写(并删除),你甚至可以删除表'albumimages',并将图像'路径'移动到'专辑'。所以你可以留在一张桌子上:'专辑'。但是,如果您确实想分开收集图像集合,则可能会出错,从中您可以根据需要选择图像。或者可能不是,然后将“路径”保存为“专辑”表中的专辑详细信息是有意义的。实际上,您的决定基于您的愿景和使用情况。祝你好运! – 2017-07-18 04:05:33
你是否直接用PHPmyAdmin或别的东西组成变量来试图查询? – Difster
是的,我已经在我的数据库中有值。 –
我的意思是,直接用SQL命令运行查询,看看你的连接是否有效。 – Difster