1

コードを理解できないように見える、ややこしいSQLクエリを作成しようとしています。

私の例では、4 つのテーブルをクエリしています。

  1. ユーザー
  2. ドキュメント
  3. ネットワーク
  4. ネットワーク_ドキュメント

私のデータベースでは、次のルールが適用されています。ユーザーは独自のドキュメントを作成できます。ユーザーはネットワークのメンバーになることができます。独自のドキュメントの一部をネットワークに割り当てることを選択できます。ドキュメントとネットワーク間のリンクは、DocumentID と NetworkID を格納する「Network_Documents」に格納されます。

私がやろうとしているのは、ネットワークに割り当てられているすべてのドキュメントを取得するクエリを作成することです。たとえば、以下が私のデータベース データであるとします。

userID userName userEmail 
  1     Adam     1@m.net 
  2     Greg     2@m.net
  3     Tony     3@m.net

docID    docName      docContents docCreator(FK)
  1     document01     dcmnt01A       1
  2     document02     dcmnt02B       2
  3     document03     dcmnt03C       3

networkID    networkName      networkCreator(FK)
   1          network01             1
   2          network02             2     
   3          network03             3

docnetID    netID(FK)   docID(FK)
    1          1           1
    2          1           3
    3          2           9999

ここで行う必要があるのは、ネットワークに関連付けられたすべてのドキュメントを取得する SELECT クエリを作成することです。たとえば、network01 に対してクエリを実行すると、次の 2 つのドキュメントが取得されます。

ドキュメントネットワーク: network01
ドキュメント名: document01
ドキュメント作成者: Adam


ドキュメント ネットワーク: network01
ドキュメント名: document03
ドキュメント作成者: Tony

次の SQL クエリは、特定のネットワークからすべてのドキュメント (およびその作成者) を選択すると思いました。

SELECT users.userID, users.userName,
       documents.docID, documents.docName, documents.docContents, documents.docCreator
       networks.networkID, networks.networkName, networks.networkCreator,
       network_documents.netID, network_documents.docID
FROM users, documents, networks, network_documents
WHERE networkID = 1;

上記のクエリは、数百を生成するようです! レコードであり、それらはほぼすべて重複しています。このタイプのクエリを構成する正しい方法は何ですか?

助けてくれてありがとう

4

1 に答える 1

2

の使用JOIN:

SELECT  [...]
FROM    networks n
        INNER JOIN network_documents nd ON n.networkID = nd.networkID
        INNER JOIN documents d ON nd.docID = d.docID
        INNER JOIN users u ON d.docCreator = u.userID
WHERE   n.networkID = 1;

繰り返しを避けるために、テーブル名にエイリアス (短い形式) を使用しました。ASこれらがキーワード (eg )で指定されている場合がありますnetworks as n

(わかりやすくするために列のリストは省略されています)

于 2012-05-02T15:09:29.743 に答える