簡體   English   中英

3桌內聯

[英]Inner join from 3 table

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

我想從具有相同web 3個表中獲取所有記錄數據。

這是我的代碼:

$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和AAD。如何使它們成為AA BD?

請幫我。 提前致謝 :)

$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,這是無效的語法。

您可能需要閱讀更多有關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'列。

如果僅查看前兩個表,則它們只有1行,並且'web'為A。如果僅連接這些表,則會得到1行結果:

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

但是您的第三個表有2行,具有相同的“ web”值。 聯接前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 BD”的結果,則僅通過行進行迭代是不夠的。

要查看值唯一時的變化,請在“ id”列上連接所有行。 由於每行的“ id”在您的示例中都是唯一的,因此您的結果將僅獲得1行。

如果您想獲取從不同行返回的值(例如一次顯示“標題”和“內容”,然后顯示“ aut”值的列表),則需要使用2個不同的查詢或在while循環中添加一些其他邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM