找不到SQL JOIN列

时间:2015-05-17 12:38:13

标签: php mysql pdo

对于我在这里做错了什么,我真的心不在焉。

我有3张桌子:

cat_list(id,cat_title)

doc_list(id,doc_title)

cat_doc_link_table(id,link_doc_id,link_cat_id)

我正在尝试将与该类别关联的数据库中存储的任何文档显示出来,但我一直收到错误消息:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'doc_list.link_doc_id' in 'on clause'

这是我的cat_view页面的代码,它应该列出文档

<?php require_once '../db_con.php'; 

if(!empty($_GET['cat_id'])){
    $cat = intval($_GET['cat_id']);
try{
        $results = $dbh->query("SELECT *
                                FROM cat_List
                                INNER JOIN cat_doc_link_table
                                ON doc_list.link_doc_id = cat_doc_link_table.link_doc_id
                                WHERE cat_doc_link_table.link_cat_id = 3");

    } catch(Exception $e) {
    echo $e->getMessage();
    die();
    }

    $doc = $results->fetchAll(PDO::FETCH_ASSOC); 
    if($doc == FALSE){
        die();
    }
}

?>

   <p><?php 
   foreach($doc as $doc){
    echo '<span class="fullname"><a href="docView.php?doc_id='.$doc["doc_id"].'">'.$doc["doc_title"]. '</a></span><br>';
};?></p>

2 个答案:

答案 0 :(得分:2)

请改用此查询:

SELECT *
FROM doc_list
INNER JOIN cat_doc_link_table
ON doc_list.id = cat_doc_link_table.link_doc_id
WHERE cat_doc_link_table.link_cat_id = 3

您正在从OP中的cat_list表中进行选择,这不是您想要的,因为它们正在寻找文档而不是类别。您只需要doc_listcat_doc_link_table表。

您可以直接在查询中使用cat_id,如下所示:

"SELECT * ... WHERE cat_doc_link_table.link_cat_id = {$cat};"

答案 1 :(得分:1)

这是您的查询:

SELECT *
FROM cat_List INNER JOIN
     cat_doc_link_table
     ON doc_list.link_doc_id = cat_doc_link_table.link_doc_id
--------^
WHERE cat_doc_link_table.link_cat_id = 3;

显示问题。没有名为``doc_list in the来自`子句的表别名。因此错误。

最好使用表格对列名进行限定(与您一样)。但是,除非您使用表名缩写,否则代码很快就会变得难以理解。所以,我建议:

SELECT *
FROM cat_List l INNER JOIN
     cat_doc_link_table dlt
     ON l.id = dlt.link_cat_id
WHERE dlt.link_cat_id = 3;

我猜测在cat_list中调用了id列。

此外,在将列返回给应用程序时,不应使用select *。而是列出您要使用的列。这样,如果数据库结构发生变化,您将得到一个可理解的查询错误,而不是一些奇怪的应用程序错误。