1

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

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

質問。

私のデータベース構造はそのように見えます

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

一部のテーブルの説明:

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

実行中

    SELECT
    c.ID,
    c. NAME,
    COUNT(lq.id) AS Questions,
    COUNT(
        CASE
        WHEN a.id IS NULL THEN
            lq.id
        END
    ) AS UnAnswered,
    COUNT(
        CASE
        WHEN cr.id IS NULL THEN
            lq.id
        END
    ) AS UnChecked
FROM
    courses c
LEFT JOIN `courses-lessons` cl ON cl.cid = c.id
LEFT JOIN `lesson_questions` lq ON lq.lid = cl.lid
LEFT JOIN answers a ON a.qid = lq.qid
LEFT JOIN answer_chk_results cr ON cr.aid = a.id
GROUP BY
    c.ID

最初にサンプルデータを使用してSQLフィドルでテストしました。(実際のデータは巨大なので、sqlfiddleに配置できません)いくつかの値を返しました。思考はうまくいきます。しかし、実際のデータでテストしている間、それが間違った値を返すことを確認してください。外国為替、私が手動で数えるとき、の結果はall questions count25でなければなりません、しかしそれは27を返します。多分私は何か間違ったことをしています。

MySQLサーバーがローカルマシンで実行されていることに注意してください。デスクトップにリモートで接続して実際のデータでクエリをテストする場合は、teamviewerIDとパスワードを提供できます。

4

2 に答える 2

1

問題は、結合が異なると行が乗算されることだと思います。これを修正する最良の方法は、各ディメンションに沿ってサブクエリを使用することです。以下は、より実用的な方法です。選択したCOUNTをCOUNTDISTINCTに置き換えます。

SELECT c.ID, c. NAME,
       COUNT(distinct lq.id) AS Questions,
       COUNT(distinct CASE WHEN a.id IS NULL THEN lq.id END) AS UnAnswered,
       COUNT(distinct CASE WHEN cr.id IS NULL THEN lq.id END) AS UnChecked

COUNTと比較すると、COUNT DISTINCTはリソースを大量に消費します(重複を削除する必要があります)。しかし、それはおそらくあなたの目的のためにうまくいくでしょう。

于 2012-08-30T13:43:24.907 に答える
0

このクエリを使用する

SELECT
    c.ID,
    c.NAME,
    COUNT(lq.id) AS Questions,
    COUNT(IFNULL(a.id),lq.id)AS UnAnswered,
    COUNT(IFNULL(cr.id),lq.id)AS UnChecked,
FROM    courses c
LEFT JOIN `courses-lessons` cl ON cl.cid = c.id
LEFT JOIN `lesson_questions` AS lq ON lq.lid = cl.lid
LEFT JOIN answers a ON a.qid = lq.qid
LEFT JOIN answer_chk_results cr ON cr.aid = a.id
GROUP BY c.ID
于 2012-08-30T12:21:27.223 に答える