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