6

コースリストを生成してカウントする必要があります

  1. すべて
  2. 未回答
  3. 答えたがチェックされていない

質問。

これが私の質問です

SELECT c.id, 
    c.name, 
    COUNT(allq.id) 'All', 
    COUNT(unanswered.id) 'Unanswered',
    COUNT(unchecked.id) 'Unchecked'
FROM courses c
LEFT JOIN `courses-lessons` cl 
    ON c.id = cl.cid
LEFT JOIN lesson_questions allq 
    ON cl.id = allq.lid
LEFT JOIN
(
    SELECT q.id, a.qid, q.lid
    FROM lesson_questions q
    LEFT JOIN 
    (
        SELECT id, qid
        FROM answers
        WHERE id NOT IN (SELECT aid FROM answer_chk_results)
    ) a 
        ON q.id = a.qid 
) unchecked 
    ON cl.id = unchecked.lid
LEFT JOIN
(
    SELECT id
    FROM lesson_questions
    WHERE id NOT IN (SELECT qid FROM answers)
) unanswered 
    ON cl.id = unchecked.lid
GROUP BY c.id, c.name

これがSQLフィドルです

データベース構造

https://docs.google.com/open?id=0B9ExyO6ktYcOenZ1WlBwdlY2R3c

サンプルデータとして3つの質問を追加しましたが、クエリはすべての質問を計算して9を返します。それは不可能です。何かがおかしい。何が足りないのかわからない。

アップデート

いくつかの表について説明します。

  1. answer_chk_results-回答表を確認しました。したがって、このテーブルに回答が存在しない場合は、チェックされていないことを意味します
  2. lesson_questions-レッスン<->質問の関連付け(ID別)テーブル
  3. courses-lessons-コース<->レッスンの関連付け(ID別)テーブル

最初の問題だけはそれほど難しくないようです。もちろん、すべての質問の数を取得するには、私の計画は次のようになります。

  1. まず、すべてのコース名のリストを取得する必要があります。クエリは次のようになります。

    SELECT c.id、c.nameFROMコースc

  2. courses-lessons次に、から選択したすべてのコースで関連付けテーブルからすべてのレッスンを取得します1.(前のクエリを続行する方法がわかりません)

  3. 次に、から選択したレッスンID(列)ですべての質問をカウントしますlid2.

4

2 に答える 2

5

これは、条件付きカウントステートメントを使用して実行できるため、すべてのサブクエリは必要ありません。

SELECT  c.ID,
        c.Name,
        COUNT(DISTINCT q.ID) AS Questions,
        COUNT(DISTINCT CASE WHEN a.ID IS NULL THEN q.ID END) AS UnAnswered,
        COUNT(DISTINCT CASE WHEN cr.ID IS NULL AND a.ID IS NOT NULL THEN q.ID END) AS UnChecked
FROM    Courses c
        LEFT JOIN `Courses-Lessons` cl
            ON cl.CID = c.ID
        LEFT JOIN Lesson_Questions q
            ON cl.ID = q.LID
        LEFT JOIN Answers a
            ON a.QID = q.ID
        LEFT JOIN Answer_chk_results cr
            ON a.ID = cr.AID
GROUP BY c.ID --, c.Name

SQLフィドル


編集

SELECT  c.ID,
        c.Name,
        COUNT(DISTINCT q.ID) AS Questions,
        COUNT(DISTINCT CASE WHEN a.ID IS NULL THEN q.ID END) AS UnAnswered,
        COUNT(a.ID) AS Answers,
        COUNT(DISTINCT CASE WHEN cr.ID IS NULL THEN a.ID END) AS UnChecked
FROM    Courses c
        LEFT JOIN `Courses-Lessons` cl
            ON cl.CID = c.ID
        LEFT JOIN Lesson_Questions q
            ON cl.LID = q.LID
        LEFT JOIN Answers a
            ON a.QID = q.QID
        LEFT JOIN Answer_chk_results cr
            ON a.ID = cr.AID
GROUP BY c.ID, c.Name
于 2012-08-30T07:50:35.977 に答える
3

多分-http : //sqlfiddle.com/#!2/d23b4/42

SELECT  c.ID,
        c.Name,
        COUNT(q.ID) AS 'Questions',
        SUM(CASE WHEN a.ID IS NOT NULL Then 1 ELSE 0 END ) as 'Unanswered',
        SUM(CASE WHEN cr.ID IS NOT NULL Then 1 ELSE 0 END ) as 'Unchecked'
FROM    Courses c
        LEFT JOIN `Courses-Lessons` cl
            ON cl.CID = c.ID
        LEFT JOIN Lesson_Questions q
            ON cl.ID = q.LID
        LEFT JOIN Answers a         
            ON a.QID = q.ID             
        LEFT JOIN Answer_chk_results cr
            ON a.ID = cr.AID
GROUP BY c.ID
于 2012-08-30T07:59:21.343 に答える