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_list
和 cat_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 the
from` 子句。因此错误。
用 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 *
。相反,列出您将要使用的列。这样,如果数据库结构发生变化,您将得到一个可以理解的查询错误,而不是一些奇怪的应用程序错误。
我真的对我在这里做错了什么感到空白。
我有 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_list
和 cat_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 the
from` 子句。因此错误。
用 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 *
。相反,列出您将要使用的列。这样,如果数据库结构发生变化,您将得到一个可以理解的查询错误,而不是一些奇怪的应用程序错误。