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>';
}

その結果、2回印刷されます。AABとAAD.それらをAABDにする方法は?

私を助けてください。前もって感謝します :)

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

おそらく、SQLでJOINSがどのように機能するかについてもう少し読む必要があります。複数の行から結果を収集したいようですが、それは一般的には機能しません。

各テーブルの一意でない列で結合している場合は、値が繰り返されている行に対して繰り返し結果が得られることを期待する必要があります。

私はそれを適切に説明していないかもしれないので、以下でより詳細に説明します。参照としてここに再びあなたのテーブルがあります:

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

ただし、3番目のテーブルには同じ「web」値を持つ2つの行があります。最初の2つのテーブルを結合した結果の1行は、3番目のテーブルの両方の行に結合できます。これにより、次の結果が生成されます。

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

これはまさにそれが機能することになっている方法です。結果として「AABD」を取得したい場合は、行を単純に反復するだけでは不十分です。

値が一意である場合にどのように変化するかを確認するには、代わりに「id」列のすべての行を結合します。各行の「id」はサンプル内で一意であるため、結果には1行しか表示されません。

代わりに、異なる行から返される値を取得しようとしている場合(タイトルとコンテンツを一度表示し、次に「aut」値のリストを表示するなど)、2つの異なるクエリを使用するか、whileループに追加のロジックを配置する必要があります。

于 2012-09-29T21:54:48.990 に答える