尝试创建复杂SQL查询的新手SQL用户

时间:2012-05-02 15:06:20

标签: mysql sql database select

我正在尝试创建一个相当混乱的SQL查询,我似乎无法弄清楚代码。

在我的例子中,我正在查询四个表:

  1. 用户
  2. 文档
  3. 网络
  4. Network_Documents
  5. 在我的数据库中,以下规则就位:用户可以创建自己的文档,用户可以是网络的成员。他们可以选择将自己的一些文档分配给网络。文档和网络之间的链接存储在“Network_Documents”中,该文件存储DocumentID和NetworkID。

    我要做的是创建一个查询,检索分配给网络的所有文档。例如,假设以下是我的数据库数据:

    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,我检索了以下两个文档。

      

    文件网络:network01
        文件名称:document01
        文件创建者:亚当


      

    文件网络:network01
        文件名称:document03
        文件创建者:托尼

    我认为以下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;
    

    以上查询似乎产生了几百个!记录,它们几乎都是重复的。撰写此类查询的正确方法是什么?

    感谢您的帮助

1 个答案:

答案 0 :(得分: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;

我已经使用alises(简短形式)表名)以避免重复。您有时会看到使用AS关键字指定的内容(例如networks as n)。

(为清晰起见,省略了列的列表)