2012-05-01 75 views
3

多個表中提取數據,我有如下表:SQL SELECT語句從與外鍵和關聯關係

  1. Universities(iduni, uniname)
  2. Campuses(idcampus, iduni, campusname, campusaddress)
  3. Projects(idproject, idcampus, projectname)
  4. IndustryCode(idindustrycode, codenumber, description)
  5. Specialization(idspec, specname)

以下是一些上面列出的表的

  1. CampusSpecialization(idcampus, idspec)
  2. ProjectSpecialization(idproject, idSpec)
  3. ProjectIndustryCode(idproject,idindustrycode)

關聯表,我想生成通過PHP以下結構的XML文件,但無法計算出SELECT語句從數據庫中提取數據。數據是每個項目的校園,大學,項目,行業代碼和專業化數據,以便我可以根據這些相互關聯的數據在稍後的小應用程序中篩選結果。

<items> 
     <item> 
      <campus campusname="$CAMPUSNAME" uniname="$UNINAME" campusaddress="$CAMPUSADDRESS"> 
       <projects> 
        <project> 
         <name>$PROJECTNAME</name> 
         <specs> 
          <spec>$SPECNAME1</spec> 
          <spec>$SPECNAME2</spec> 
          ... 
         </specs> 
         <industries> 
          <industry>$CODENUMBER1</industry> 
          <industry>$CODENUMBER2</industry> 
          ... 
         </industries> 
        </project> 
... 
       </projects> 
      </campus> 
     </item> 
     <item> 
      <campus ... > 
       <projects> 
        <project ... > 
         ... 
        </project> 
      </campus> 
    </items> 

這是我的SQL statment至今:

SELECT 
    campusname, 
    specname, 
    projectname 
FROM 
    Specialization,Projects 
    JOIN CampusSpecialization ON CampusSpecialization.idspec = Specialization.idspec 
    JOIN Campuses ON CampusSpecialization.idcampus = Campuses.idcampus 
    JOIN ProjectSpecialization ON ProjectSpecialization.idspec = Specialization.idspec 

編輯:

項目可能有一個或多個代碼和行業。

+0

你的問題是什麼? – dqhendricks

+0

我找不出SQL語句來將所有表中的所有數據選擇到一個結果集中,以便我可以使用它來構建具有上述結構化輪廓的XML文件。 – user1366451

回答

1

試試這個:

SELECT c.campusname,u.uniname,c.campusaddress, s.specname, ic.codenumber, p.projectname 
FROM campuses c 
INNER JOIN universities u ON u.iduni = c.iduni 
INNER JOIN camousspecialization cs ON cs.idcampus = c.idcampus 
INNER JOIN speicialization s ON s.idspec = cs.idspec 
INNER JOIN projectspecialization ps ON ps.idproject = s.idspec 
INNER JOIN projectindustrycode pi On pi.idproject = ps.idproject 
INNER JOIN industrycode ic on ic.industrycode = pi.industrycode 
INNER JOIN projects p on p.idproject = ps.idproject 
+0

嗯。 'INNER JOIN projectspecialization ps ON ps.idproject = s。idspec' - 在這裏遇到麻煩。將項目的id與specilization的ID配對是沒有意義的。 – user1366451

+0

我們需要這個用projectindustrycode創建另一個連接 –

+0

嗯。只有一個校園在我的數據庫中做過任何項目,但由於某種原因,我得到的結果表明,每個校園都做了三次完全相同的項目。 – user1366451

0

沒有測試,但這應該把所有校區與工程,以及項目的碼號和specName。

請注意,我不完全確定您的模式。關聯表意味着每個項目可能有多個代碼和specNames。而xml意味着每個項目只有其中的一個。該查詢將爲關聯表中的每個條目返回一條記錄。即如果「項目A」有三(3)個規格,SELECT將返回三(3)條記錄。

SELECT c.idCampus 
     , c.campusName 
     , c.campusAddress 
     , u.uniName 
     , p.projectName 
     , s.specName as ProjectSpecName 
     , ic.codeNumber AS ProjectCodeNumber 
FROM Campuses c 
      INNER JOIN Universities u ON u.iduni = c.iduni 
      INNER JOIN Projects p ON p.idcampus = c.idcampus 
      INNER JOIN ProjectSpecialization ps ON ps.idproject = p.idproject 
      INNER JOIN Specialization s ON s.idspec = ps.idspec 
      INNER JOIN ProjectIndustryCode pic ON pic.idproject = p.idproject 
      INNER JOIN IndustryCode ic ON ic.idindustrycode = pic.idindustrycode 

編輯:不幸的是,我不使用PHP。所以我不知道在PHP中生成XML的最佳或標準方法。您可以在SELECT中使用group_concat來返回每個項目的代碼和名稱的連接列表。然後將這些字符串拆分爲一個數組,並使用數組數來生成所需數量的xml元素。

SELECT c.idCampus 
     , c.campusName 
     , c.campusAddress 
     , u.uniName 
     , p.projectName 
     , GROUP_CONCAT(s.specName SEPARATOR '|') as SpecNameList 
     , GROUP_CONCAT(ic.codeNumber SEPARATOR '|') AS CodeNumberList 
     ... 
+0

整潔。我不知道有sql突出顯示。謝謝@Ben。 – Leigh

+0

@leigh沒問題,SO使用Google Prettify進行標記,但取決於問題中的標記。由於PHP在開始時會突出顯示PHP關鍵字;你可以把它切換成你想要的! – Ben

+0

不錯。每天學習新的東西:) – Leigh