从mySQL中的各个表中选择列

时间:2012-03-07 13:48:02

标签: mysql select join multiple-tables

我有一个动态的类别列表,从mySQL中检索。当用户单击某个类别时,它会从该DB加载该特定类别的图像。这是它的功能:

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"));
}

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

怎么做?

4 个答案:

答案 0 :(得分:4)

SQL查询中存在错误,categoryID不明确。尝试:

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

答案 1 :(得分:4)

在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注入。

答案 2 :(得分:2)

重新说明已经说过的内容,尝试左连接,以便未分类的图像不会被过滤掉并使用如下所示的转义:

$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) . ";"

答案 3 :(得分:1)

我认为您必须使用表名限定WHERE子句中的字段,即

WHERE image.categoryID=$categoryID

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