2017-10-06 15 views
1

Je veux obtenir le nombre d'enregistrements saisis par un utilisateur dans la table différente. Le schéma de DB est:enregistrements Sélectionnez le tableau que les chiffres de différents sur la base de rejoindre

+-----------------------+ 
| 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 | 
+----------------+------+ 

Je veux voir le nombre de documents créés par chaque utilisateur dans chaque table quelque chose comme ceci:

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 

Après avoir examiné les liens suivants:

  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

j'ai pu écrire cette requête mais il donne les mêmes enregistrements dans toutes les colonnes:

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 

EDIT

Voici la relation description:

  1. FamilyMasterId est la clé étrangère dans Surveymaster et FamilyDetail tables.
  2. FamilyDetailId est la clé étrangère dans le tableau de TravelMaster. TravelMasterId est la clé étrangère dans la table TravelDetail.
+0

Si les performances ne sont pas un problème, vous pouvez obtenir chaque compte en utilisant un sous-requête distincte. BTW, la relation entre les tables ne sont pas claires. – FLICKER

+0

'pour obtenir le nombre d'enregistrements entrés par un utilisateur dans la table différente' ** Vous avez besoin d'USERID ** dans chaque table, par ex. created_by_userid –

+0

@Used_By_Already est pas là quelque façon que nous pouvons obtenir le nombre que nous les jointures entre toutes les tables –

Répondre

1

Cela pourrait ne pas être la solution parfaite si l'on considère la performance, mais il peut donner le résultat souhaité

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

Merci .. mais quelle pourrait être la meilleure option si nous parlons de la performance car cela va être l'indicateur clé de performance de mon projet –

+0

La solution la plus simple est la démoralisation à savoir ajouter l'utilisateur Id clé étrangère colonne dans chaque table. – Yared

+0

juste pour la connaissance, penses-tu qu'ajouter userId à chaque table serait une bonne pratique ?. Je ne suis pas un expert mais je pense que nous devrions réduire autant que possible la redondance des données. –