SQL 未找到加入列

SQL JOIN Column not found

我真的对我在这里做错了什么感到空白。

我有 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>

改为使用此查询:

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 table 中选择的,这不是您想要的,因为您正在寻找文档而不是类别。您只需要 doc_listcat_doc_link_table tables.

您可以像这样在查询中直接使用 cat_id

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

这是您的查询:

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;

显示问题。没有 table alias called ``doc_listin thefrom` 子句。因此错误。

用 table 限定列名是一种很好的做法(正如您所做的那样)。但是,除非您使用 table 名称的缩写,否则代码很快就会变得难以阅读。所以,我会推荐:

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 *。相反,列出您将要使用的列。这样,如果数据库结构发生变化,您将得到一个可以理解的查询错误,而不是一些奇怪的应用程序错误。