【问题标题】:Select columns from various tables in mySQL从 mySQL 中的各种表中选择列
【发布时间】:2012-03-07 13:48:02
【问题描述】:

我有一个动态的类别列表,它是从 mySQL 中检索的。当用户单击一个类别时,它会从数据库中加载该特定类别的图像。这是执行此操作的函数:

function getImages($categoryID)
{
return json_encode(select("SELECT * FROM images WHERE categoryID=$categoryID"));
}

现在我还想再次从“类别”表中检索类别名称(以在页面的其他部分包含所选类别的名称)。我试着这样做:

function getImages($categoryID)
{
return json_encode(select(
        "SELECT categories.categoryName, images.imageFileName, images.imageHeader 
        FROM images JOIN categories 
        ON categories.categoryID = images.categoryID 
        WHERE categoryID=$categoryID"));
}

但这不起作用,现在我什至没有得到图像。

怎么做?

【问题讨论】:

  • WHERE categoryID ... 不明确。试试WHERE categories.categoryID ...

标签: mysql select join multiple-tables


【解决方案1】:

在您的 WHERE 子句中,categoryID 不明确。

WHERE categoryID=$categoryID

由于您有两个带有 categoryID 的表,因此您需要确定 WHERE 应该查看哪一个。

WHERE categories.categoryID=$categoryID

为了让您自己的生活更轻松,您可能需要考虑为您的表设置别名,如下所示:

SELECT c.categoryName, i.imageFileName, i.imageHeader 
FROM images i
JOIN categories c ON c.categoryID = i.categoryID 
WHERE c.categoryID=$categoryID

另外,您正在使用哪种语言进行开发?如果这是一个 Web 应用程序,您可能需要考虑转义 $categoryID 以防止 SQL 注入。

【讨论】:

  • 非常感谢!是的,这行得通,现在我得到了类别名称和图像!我用 PHP 和 JS 开发。是的,它适用于网络。虽然我认为用户甚至不会看到 $categoryID 部分 - 当他们单击链接时,他们会看到一个 JS 代码,例如:javascript:getImages(4),其中 getImages 是调用 API.php 的函数和 API.php 用于 BusinessLogic.php,它包含我的 getImages() 函数,带有 SELECT 语句。但我肯定想了解更多关于 SQL 注入的信息,因为我也计划制作一些 cmets 字段......
【解决方案2】:

SQL查询出错,categoryID不明确。试试:

SELECT 
    categories.categoryName, 
    images.imageFileName, 
    images.imageHeader 
FROM 
    images 
JOIN 
    categories on categories.categoryID = images.categoryID 
WHERE 
    categories.categoryID=$categoryID;

【讨论】:

    【解决方案3】:

    重新讨论已经说过的内容,尝试左连接,这样未分类的图像就不会被过滤掉,并使用如下转义:

    $query = "SELECT c.categoryName, i.imageFileName, i.imageHeader 
      FROM images i
    LEFT JOIN categories c
      ON c.categoryID = i.categoryID 
    WHERE c.categoryID= " . intval($categoryID) . ";"
    

    【讨论】:

      【解决方案4】:

      我认为您必须使用表名来限定 WHEREclause 中的字段,即

      WHERE image.categoryID=$categoryID
      

      数据库引擎不知道您指的是两个 categoryID 字段中的哪一个。如果你再次遇到这样的问题,你应该在 MySQL 命令行上测试查询。在那里您会收到一条错误消息,这对修复您的错误非常有帮助。

      【讨论】:

        猜你喜欢
        • 2016-10-15
        • 2019-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-22
        • 2012-07-09
        • 1970-01-01
        相关资源
        最近更新 更多