2017-10-06 10 views
1

ユーザーが入力したレコードの数を別のテーブルに入れたいとします。 DBのスキーマは次のとおりです。レコードを選択すると、別のテーブルから集計の対象となります。

    次のリンクを確認した後

    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 
    

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

    は、私はこのような各テーブル何かに各ユーザーによって作成されたレコードの数を見てみたいです

  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 

EDIT

は関係あり説明:

  1. FamilyMasterIdはSurveyMasterとFamilyDetailの外部キーです テーブル。
  2. FamilyDetailIdは、TravelMasterテーブルの外部キーです。
  3. TravelMasterIdは、TravelDetailテーブルの外部キーです。
+0

を与えることができる場合、これは完璧なソリューションではないかもしれません。ところで、テーブル間の関係は明確ではありません。 – FLICKER

+0

'異なるテーブルにユーザが入力したレコードの数を取得するために' **各テーブルにはUSERID **が必要です。 created_by_userid –

+0

@Used_By_すでにすべてのテーブルに参加していますが、カウントを取得する方法はありません –

答えて

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

ありがとうございます。私のプロジェクトのKPIになるので、パフォーマンスについて話すと、より良い選択肢になるかもしれません。 –

+0

最も簡単な解決策は、ユーザーIDの外部キー列を追加することです。各テーブルに – Yared

+0

ちょうど知識のために、各テーブルにuserIdを追加するのがベストプラクティスでしょうか?私は専門家ではありませんが、できるだけデータの冗長性を減らすべきだと思います。 –

関連する問題