php - 为什么我的 3 表 JOIN MySQL 查询不起作用?

标签 php mysql

我有 3 张 table :

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

Table: albumconnect
Columns: id, imageid, albumid

Table: albumimages
Columns: id, path

我正在尝试用单个 JOIN 查询替换所有这些不必要的查询:

<?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 内容时,它会打印 Null,因此我认为我的查询不正确,但我无法找出正确的方法。

最佳答案

应该是这样的。我没有测试过。正如@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>';
}

关于php - 为什么我的 3 表 JOIN MySQL 查询不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45156302/

相关文章:

mysql - 如何在mysql中获取6个月的数据加上本月的数据?

php - 使用 php 和/或 CSS 的字体大小

php - 发送内部电子邮件

javascript - ajax 表单请求仍然重新加载页面

php - 执行连接 UPDATE 查询时 mysql_query 返回 true

mysql - 如何使用 mysqlimport 累积结果

php - 如果列不为 NULL,如何更新表中的列?

mysql(5.1)命令行界面和我的疯狂

php - 在 PHP 中为数据类型创建 'IF' 语句

PHP 无法从数据库下载上传的文件,因为使用中文文件名上传