0

我有 3 张桌子:

tb_wrapper              tb_doc                 tb_aut
=====================   ====================   =======================
|id|web|title|source|   |id| web | content |   |id|web|aut  | linkAut|
=====================   ====================   =======================  
|1 | A |  AA | AAA  |   |1 | A   |  AAAA   |   |1 | A | B   | C      |
=====================   ====================   |2 | A | D   | E      |
                                               =======================

我想从具有相同的 3 个表中获取所有记录数据web

这是我的代码:

$query = mysql_query("
                     SELECT 
                        tb_wrapper.web,
                        tb_wrapper.title,
                        tb_wrapper.source,
                        tb_doc.web,
                        tb_doc.content,
                        tb_aut.web,
                        tb_aut.aut,
                        tb_aut.linkAut
                     FROM
                        tb_doc
                     INNER JOIN tb_wrapper ON tb_doc.web = tb_wrapper.web 
                        AND
                     INNER JOIN tb_aut ON tb_doc.web = tb_aut.web 
 ");

错误问题: Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in D:\AppServ\www\sukses\indexsummary.php on line 87

编辑

然后我想把它们全部打印出来:

while ($row = mysql_fetch_array($query)) {
    $source  = $row['source'];
    $title   = $row['title'];
    $content = $row['content'];
    $aut  = $row['aut'];
    $linkAut   = $row['linkAut'];
echo '<h2><a href='.$source.'> '.$title.' </a></h2>';
echo '<p><a href='.$aut_url.'> '.$aut.'  </a></p>';
}

结果,它们被打印了两次。AA B 和 AA D。如何使它们成为 AA BD ?

请帮我。提前致谢 :)

4

2 回答 2

2
$query = mysql_query("
                     SELECT 
                        tb_wrapper.web,
                        tb_wrapper.title,
                        tb_wrapper.source,
                        tb_doc.web,
                        tb_doc.content,
                        tb_aut.web,
                        tb_aut.aut,
                        tb_aut.linkAut
                     FROM
                        tb_doc
                     INNER JOIN tb_wrapper ON tb_doc.web = tb_wrapper.web
                     INNER JOIN tb_aut ON tb_doc.web = tb_aut.web 

您需要删除内部连接之间的 AND,这是无效的语法。

于 2012-09-29T21:01:02.130 回答
1

您可能需要阅读更多关于 JOINS 如何在 SQL 中工作的信息。您似乎想从多行收集结果,但这通常不是它的工作方式。

如果您要加入每个表中的非唯一列,您应该期望获得具有重复值的行的重复结果。

我可能没有正确解释,所以下面更详细。以下是您的表格作为参考:

tb_wrapper              tb_doc                 tb_aut
=====================   ====================   =======================
|id|web|title|source|   |id| web | content |   |id|web|aut  | linkAut|
=====================   ====================   =======================  
|1 | A |  AA | AAA  |   |1 | A   |  AAAA   |   |1 | A | B   | C      |
=====================   ====================   |2 | A | D   | E      |
                                               =======================

您的查询(没有其他人建议的 AND)加入每个表的“网络”列。

如果您只查看前 2 个表,它们只有 1 行,“web”是 A。如果您只加入这些表,您将得到 1 行结果:

==================================
|web|title|source| web | content |
==================================
| A |  AA | AAA  | A   |  AAAA   |
==================================

但是您的第三个表有 2 行具有相同的“网络”值。连接前 2 个表的 1 行结果可以连接到第三个表的两行。这会产生以下结果:

=====================================================
|web|title|source| web | content |web|aut  | linkAut|
=====================================================  
| A |  AA | AAA  | A   |  AAAA   | A | B   | C      |
| A |  AA | AAA  | A   |  AAAA   | A | D   | E      |
=====================================================

然后,您的 PHP 循环遍历结果并从每行打印 2 列('title' 和 'aut'),结果是:

AA  B
AA  D

这正是它应该如何工作的。如果您想获得 'AA B D' 作为结果,通过行进行简单的迭代是不够的。

要查看值唯一时它如何变化,请将所有行加入“id”列。由于每一行的“id”在您的样本中都是唯一的,因此您的结果中只会得到 1 行。

如果您尝试获取从不同行返回的值(例如显示一次标题和内容,然后显示“aut”值列表),则需要使用 2 个不同的查询或在while循环中添加一些额外的逻辑。

于 2012-09-29T21:54:48.990 回答