从3表内连接

时间:2012-09-29 20:57:34

标签: php mysql

我有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 B D?

请帮帮我。提前谢谢:)

2 个答案:

答案 0 :(得分: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,这是无效的语法。

答案 1 :(得分: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)加入每个表的“web”列。

如果您只看前2个表,它们只有1行而'web'是A.如果您只加入这些表,您将获得1行结果:

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

但是你的第三个表有两行具有相同的'web'值。加入前两个表的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循环。