0

SQL、特に集計関数の経験があまりないため、SQL ステートメントを適切にまとめるのに苦労しています。基本的な SQL 構造の外で何をしているのか、よくわからないと言っても過言ではありません。通常の結合はできますが、複雑な結合はできません。

'Survey''Questions''Session''ParentSurvey'、および'ParentSurveyQuestion' のテーブルがいくつかあります。構造的に、調査には質問を含めることができ、調査を開始したユーザー (セッション) を含めることができ、質問が現在の調査にインポートされる親調査を含めることができます。

私がやりたいことは、Survey テーブルの各調査の情報を取得することです。質問の総数、開始されたセッションの数 (条件付きで終了していないセッション)、および保護者アンケートの質問の数。結合された 3 つのテーブルには値を含めることができますが、値を含める必要はありません。含まれていない場合は、COUNT によって 0 が返されます。3 つのテーブルの共通フィールドは、「survey_id」のバリエーションです。

これまでのSQLは次のとおりです。その下にテーブル構造を置きます。

 SELECT 
   `kp_survey_id`,
   COALESCE( q.cnt, 0 ) AS questionsAmount,
   COALESCE( s.cnt, 0 ) AS sessionsAmount
   COALESCE( p.cnt, 0 ) AS parentQAmount,
 FROM `Survey`
   LEFT JOIN                    <-- I'd like the count of questions for this survey
      ( SELECT COUNT(*) AS cnt 
      FROM Questions
      GROUP BY kf_survey_id ) q
     ON Survey.kp_survey_id = Questions.kf_survey_id
   LEFT JOIN 
      ( SELECT COUNT(*) AS cnt    <-- I'd like the count of started sessions for this survey
      FROM Session
      WHERE session_status = 'started'  <-- should this be Session.session_status?
      GROUP BY kf_survey_id ) s
     ON Survey.kp_survey_id = Session.kf_survey_id
   LEFT JOIN            
      ( SELECT COUNT(*) AS cnt    <-- I'd like the count of questions in the parent survey with this survey id
      FROM ParentSurvey
      GROUP BY kp_parent_survey_id ) p
     ON Survey.kf_parent_survey_id = ParentSurveyQuestion.kf_parent_survey_id

「kp」接頭辞は主キーを意味し、「kf」接頭辞は外部キーを意味します
。 構造:

調査: 'kp_survey_id' | 「kf_parent_survey_id」

質問: 'kp_question_id' | 「kf_survey_id」

セッション: 'kp_session_id' | 'kf_survey_id' | 'session_status'

親調査: 'kp_parent_survey_id' | 'survey_name'

ParentSurveyQuestion: 'kp_parent_question_id' | 「kf_parent_survey_id」

各テーブルには「name」や「account_id」などの他の列もありますが、この場合は重要ではないと思います

これを正しく行っているか、何かが足りないかどうかを知りたいです。このサイトで 3 つを超えるテーブルの条件付き集計を見たことがないため、stackoverflow で見つけたコードを転用し、ニーズに合わせて変更しています。

私の期待される出力は次のようなものです:

kp_survey_id   |   questionsAmount   |   sessionsAmount   |   parentQAmount  
    1          |         3           |         0          |        3
    2          |         0           |         5          |        3
4

2 に答える 2

1

必要なことの 1 つは、結合を修正することです。サブクエリに参加する場合は、サブクエリのエイリアスを使用する必要があります。あなたの場合、サブクエリで使用されているテーブルのエイリアスを使用しています。

変更する必要があるもう 1 つのことは、サブクエリの JOIN で使用するフィールドを含めることです。

これらの変更を行い、実行してみてください。エラーまたは望ましい結果が得られますか?

SELECT 
   `kp_survey_id`,
   COALESCE( q.cnt, 0 ) AS questionsAmount,
   COALESCE( s.cnt, 0 ) AS sessionsAmount
   COALESCE( p.cnt, 0 ) AS parentQAmount,
 FROM `Survey`
   LEFT JOIN                    <-- I'd like the count of questions for this survey
      ( SELECT kf_survey_id, COUNT(*) AS cnt 
      FROM Questions
      GROUP BY kf_survey_id ) q
     ON Survey.kp_survey_id = q.kf_survey_id
   LEFT JOIN 
      ( SELECT kf_survey_id, COUNT(*) AS cnt    <-- I'd like the count of started sessions for this survey
      FROM Session
      WHERE session_status = 'started'  <-- should this be Session.session_status?
      GROUP BY kf_survey_id ) s
     ON Survey.kp_survey_id = s.kf_survey_id
   LEFT JOIN            
      ( SELECT kp_parent_survey_id, COUNT(*) AS cnt    <-- I'd like the count of questions in the parent survey with this survey id
      FROM ParentSurvey
      GROUP BY kp_parent_survey_id ) p
     ON Survey.kf_parent_survey_id = p.kf_parent_survey_id
于 2013-02-20T20:44:18.010 に答える
1

あなたはかなり近かったと思います-結合を修正し、それらの結合で使用するサブクエリに調査IDを含める必要があるだけです:

SELECT 
   `kp_survey_id`,
   COALESCE( q.cnt, 0 ) AS questionsAmount,
   COALESCE( s.cnt, 0 ) AS sessionsAmount
   COALESCE( p.cnt, 0 ) AS parentQAmount,
 FROM `Survey`
   LEFT JOIN                    
      ( SELECT COUNT(*) cnt, kf_survey_id AS cnt 
      FROM Questions
      GROUP BY kf_survey_id ) q
     ON Survey.kp_survey_id = q.kf_survey_id
   LEFT JOIN 
      ( SELECT COUNT(*) cnt, kf_survey_id
      FROM Session
      WHERE session_status = 'started'  
      GROUP BY kf_survey_id ) s
     ON Survey.kp_survey_id = s.kf_survey_id
   LEFT JOIN            
      ( SELECT COUNT(*) cnt, kp_parent_survey_id
      FROM ParentSurvey
      GROUP BY kp_parent_survey_id ) p
     ON Survey.kf_parent_survey_id = p.kp_parent_survey_id
于 2013-02-20T20:45:44.420 に答える