0

私の問題は次のとおりです。

コンテンツを含む3つのテーブルがあります。

tableA:|ID_A|field1|field2|field3| => base table


tableB:|ID_B | ID_C |ID_A| => Mapping Table


tableC:|ID_C |FieldToGet| => Additional info field table

*重要な前提条件:tableB:の構造が次のように、同じID_Aに関連付けられたID_Cの値が複数ある可能性があります。`

| ID_B | ID_C | ID_A|

|  24  |  81  |  23 |

|  25  |  11  |  23 |

|  26  | 82   |  23 |

|  27  | 42   |  24 |

|  28  | 113  | 33  |

ただし、1つのID_Aに対して複数のID_Bが存在する場合、それらは相互にフォローします。

現在、特定のID_Aに必要なファイルをフェッチするphpスクリプトを作成していますが、サブクエリが複数の行を返すため失敗します。

$q = $this->dao->prepare('SELECT FieldToGet FROM table3  WHERE ID_C = ( SELECT ID_C FROM table2 WHERE ID_A =$SOME_ID_A )');

私は、列FieldToGet(私の現在の試み)からの結果のみをフェッチするソリューション、または列FieldToGet(JOIN操作の使用方法がわからない)を使用してベーステーブル全体を結合するソリューションのいずれかを探しています。

4

2 に答える 2

2

結合は次のようになります。

SELECT  a.*, c.*   -- select the columns you want to get
FROM    tableA a
        INNER JOIN tableB b
            ON a.ID_A = b.ID_A
        INNER JOIN tableC c
            ON b.ID_C = c.ID_C

結合に関する知識を完全に得るには、以下のリンクにアクセスしてください。

于 2013-01-31T02:23:03.870 に答える
1

私があなたのニーズを理解しているのか完全にはわかりません。@JWは、INNERJOINを使用して3つのテーブルを接続する方法を正しく示しています。

あなたの質問は非常に近いです。WHERE ID_C =を使用する代わりに、WHERE ID_C IN()を使用する必要があります。

SELECT FieldToGet 
FROM table3  
WHERE ID_C IN (SELECT ID_C FROM table2 WHERE ID_A =$SOME_ID_A)

私は個人的にINよりもJOINを使用することを好みますが、DB構造によっては、JOINを使用すると複数の結果が返され、DISTINCTまたはGROUP BYを使用する必要があるため、INを使用すると実際にパフォーマンスが向上する可能性があります。これは私がそれについて読んだ良い投稿でした:

http://explainextended.com/2009/06/16/in-vs-join-vs-exists/

そして1つはSOです:

https://stackoverflow.com/a/4755644/1073631

幸運を。

于 2013-01-31T02:43:07.493 に答える