2017-10-06 98 views
1

我想要獲取用戶在不同表中輸入的記錄數。 DB的模式是:根據加入從不同表中選擇記錄數

+-----------------------+ 
| Survey Master   | 
+----------------+------+ 
| Field   | Key | 
+----------------+------+ 
| id    | PK | 
| Username  |  | 
| FamilyMasterId | FK | 
+----------------+------+ 

+------------+------+ 
| Family Master  | 
+------------+------+ 
| Field  | Key | 
+------------+------+ 
| id   | PK | 
+------------+------+ 

+-----------------------+ 
| Family Detail   | 
+----------------+------+ 
| Field   | Key | 
+----------------+------+ 
| id    | PK | 
| FamilyMasterId | FK | 
+----------------+------+ 

+-----------------------+ 
| Travel Master   | 
+----------------+------+ 
| Field   | Key | 
+----------------+------+ 
| id    | PK | 
| FamilyDetailId | FK | 
+----------------+------+ 

+-----------------------+ 
| Travel Detail   | 
+----------------+------+ 
| Field   | Key | 
+----------------+------+ 
| id    | PK | 
| TravelMasterId | FK | 
+----------------+------+ 

我希望看到每個用戶在每個表是這樣創造的記錄數:

    Username SurveyMaster FamilyMaster FamilyDetail TravelMaster TravelDetail 
    ---------- -------------- -------------- -------------- -------------- -------------- 
        User001 59    47    36    26    12    
        User002 88    76    64    42    25    
        User003 49    44    35    25    15    
        User004 77    69    55    45    37 
    

    查看以下鏈接後

  1. Find Records from Different Tables
  2. Select count(*) from multiple tables
  3. http://www.sqlines.com/mysql/how-to/join-different-tables-based-on-condition
  4. http://www.informit.com/articles/article.aspx?p=30875&seqNum=5
  5. SQL: Combine Select count(*) from multiple tables

我能寫這個查詢,但它給出了相同的記錄中的所有列:

SELECT USERNAME, COUNT(USERNAME) SURVEYMASTER, COUNT(USERNAME) FAMILYMASTER, COUNT(USERNAME) FAMILYDETAIL, COUNT(USERNAME) TRAVELMASTER, COUNT(USERNAME) TRAVELDETAIL FROM 
((SELECT CREATEUSER USERNAME FROM SURVEYMASTER 
) 
UNION ALL 
(SELECT SM.CREATEUSER USERNAME FROM SURVEYMASTER SM 
INNER JOIN FAMILYMASTER FM ON FM.ID = SM.FAMILYMASTERID 
) 
UNION ALL 
(SELECT SM.CREATEUSER USERNAME FROM SURVEYMASTER SM 
INNER JOIN FAMILYMASTER FM ON FM.ID = SM.FAMILYMASTERID 
INNER JOIN FAMILYDETAIL FD ON FM.ID = FD.FAMILYMASTERID 
) 
UNION ALL 
(SELECT SM.CREATEUSER USERNAME FROM SURVEYMASTER SM 
INNER JOIN FAMILYMASTER FM ON FM.ID = SM.FAMILYMASTERID 
INNER JOIN FAMILYDETAIL FD ON FM.ID = FD.FAMILYMASTERID 
INNER JOIN TRAVELMASTER TM ON FD.ID = TM.FAMILYDETAILID 
) 
UNION ALL 
(SELECT SM.CREATEUSER USERNAME FROM SURVEYMASTER SM 
INNER JOIN FAMILYMASTER FM ON FM.ID = SM.FAMILYMASTERID 
INNER JOIN FAMILYDETAIL FD ON FM.ID = FD.FAMILYMASTERID 
INNER JOIN TRAVELMASTER TM ON FD.ID = TM.FAMILYDETAILID 
INNER JOIN TRAVELDETAIL TD ON TM.ID = TD.TRAVELMASTERID 
) 
) T 
GROUP BY USERNAME 
ORDER BY USERNAME 

編輯

這裏是關係描述:

  1. FamilyMasterId是SurveyMaster和FamilyDetail 表中的外鍵。
  2. FamilyDetailId是TravelMaster表中的外鍵。
  3. TravelMasterId是TravelDetail表中的外鍵。
+0

如果性能是不是一個問題,你可以使用一個單獨的子查詢中獲取每個計數。順便說一句,表格之間的關係並不清楚。 – FLICKER

+0

'以獲得用戶在不同表中輸入的記錄的數量** **每個表中都需要USERID **例如created_by_userid –

+0

@Used_By_Already沒有辦法讓我們可以通過所有表格之間的連接來計數 –

回答

1

這可能不是完美的解決方案,如果我們考慮性能,但它可以得到期望的結果

SELECT sm.Username , 
     COUNT(*) SurveyMaster , 
     COUNT(FamilyMasterId) FamilyMaster , 
     fd.FamilyDetail , 
     tm.TravelMaster , 
     td.TravelDetail 
FROM SurveyMaster sm 
     JOIN (SELECT Username , 
         COUNT(fd.id) FamilyDetail 
       FROM  SurveyMaster sm 
         JOIN FamilyMaster fm ON sm.FamilyMasterId = fm.Id 
         JOIN FamilyDetail fd ON fm.id = fd.FamilyMasterId 
       GROUP BY Username 
      ) fd ON sm.Username = fd.Username 
     JOIN (SELECT Username , 
         COUNT(tm.id) TravelMaster 
       FROM  SurveyMaster sm 
         JOIN FamilyMaster fm ON sm.FamilyMasterId = fm.Id 
         JOIN FamilyDetail fd ON fm.id = fd.FamilyMasterId 
         JOIN TravelMaster tm ON fd.Id = tm.FamilyDetailId 
       GROUP BY Username 
      ) tm ON sm.Username = tm.Username 
     JOIN (SELECT Username , 
         COUNT(td.id) TravelDetail 
       FROM  SurveyMaster sm 
         JOIN FamilyMaster fm ON sm.FamilyMasterId = fm.Id 
         JOIN FamilyDetail fd ON fm.id = fd.FamilyMasterId 
         JOIN TravelMaster tm ON fd.Id = tm.FamilyDetailId 
         JOIN TravelDetail td ON tm.Id = td.TravelMasterId 
       GROUP BY Username 
      ) td ON sm.Username = td.Username 
GROUP BY sm.Username , 
     fd.FamilyDetail , 
     tm.TravelMaster , 
     td.TravelDetail; 
+0

謝謝..但是如果我們談論性能,最好的選擇是什麼,因爲這將成爲我的項目的關鍵績效指標 –

+0

最簡單的解決方案是道德敗壞,即添加用戶ID外鍵列在每個表中。 – Yared

+0

只是爲了知識,你認爲將userId添加到每個表將是一個最佳實踐?我不是專家,但我認爲我們應儘可能減少數據冗餘。 –

相關問題