2017-02-07 7 views
2

これは私の最初の質問ですので、私はそれを台無しにしないことを願っています。 http://sqlfiddle.com/#!9/7f2b5c/7Mysqlのクエリで条件が他の列の合計

我々は質問、回答、question_typesとanswer_typesを持っている:

は、ここで私は私がそれを説明するために作られたSQLフィドルです。

それぞれの質問について、どれくらいの人が各answer_typeに回答したのか、またその質問に回答した人の数がわかりますが、合計を取得できません。

これは私が取得していますものです:

id | fk_question_type | description   | num | value  | total 
1 | 1    | How was the breakfast? | 0 | Bad  | 0 
1 | 1    | How was the breakfast? | 1 | Good  | 1 
1 | 1    | How was the breakfast? | 0 | Indifferent| 0 
1 | 1    | How was the breakfast? | 2 | Very good | 2 
2 | 1    | How was the lunch?  | 0 | Bad  | 0 
2 | 1    | How was the lunch?  | 1 | Good  | 1 
2 | 1    | How was the lunch?  | 0 | Indifferent| 1 
2 | 1    | How was the lunch?  | 1 | Very good | 1 

これは私が好きなものです:

id | fk_question_type | description   | num | value  | total 
1 | 1    | How was the breakfast? | 0 | Bad  | 3 
1 | 1    | How was the breakfast? | 1 | Good  | 3 
1 | 1    | How was the breakfast? | 0 | Indifferent| 3 
1 | 1    | How was the breakfast? | 2 | Very good | 3 
2 | 1    | How was the lunch?  | 0 | Bad  | 2 
2 | 1    | How was the lunch?  | 1 | Good  | 2 
2 | 1    | How was the lunch?  | 0 | Indifferent| 2 
2 | 1    | How was the lunch?  | 1 | Very good | 2 

私が今しようとしているクエリ:

SELECT id, fk_question_type, description, num, value, SUM(num) AS totalAnswers 
FROM (
    (SELECT q.id, q.fk_question_type, q.description, COUNT(a.id) AS num, at.value 
    FROM answer a 
    LEFT JOIN question q ON a.`fk_question`=q.`id` 
    LEFT JOIN answer_type at ON at.id = a.`fk_answer_type` 
    GROUP BY q.id, at.id ORDER BY q.id, at.id) 
    UNION ALL 
    (SELECT q.id, q.fk_question_type, q.description, 0 AS num, at.value 
    FROM answer a 
    LEFT JOIN question q ON a.`fk_question`=q.`id` 
    LEFT JOIN answer_type at ON at.fk_question_type=q.fk_question_type 
    GROUP BY q.id, at.id ORDER BY q.id, at.id) 
) AS T 
WHERE fk_question_type = 1 
GROUP BY id, value ORDER BY id 

他の列を維持しながら、同じIDを持つ行のnumをSUMでSUMにする方法はありますか?

+1

あなたは本当に代わりに 'INNER JOIN'の' LEFT JOIN'を使用する必要がありますか?対応する質問なしに本当に答えがありますか? – Barmar

+0

フィドルのテーブルから「答え」を見ると、「朝食はどうだった?」「昼食はどうだった?」「もう一度やってきますか?」という質問がそれぞれ3回尋ねられました。 「夕食はどうだった?」という質問は二度しか聞かれなかった。それが注目されているので、numで見たいものと 'total'で何を見たいのかを詳しく教えてもらえますか? –

+0

@DhruvSaxena私は 'num'をすでにどのようにしたいのですか?'朝食はどうでした? 'は0回、Goodは1回、無関心は0回、非常に良い。 'トータル'は質問の回答回数でなければならないので、 '朝食はどうだったの? 'の行ごとに3回です。 申し訳ありませんが、私はそれを明確にしませんでした。 – EnricSV

答えて

0

サブクエリを使用して、それぞれidの合計を取得し、それを値の行を取得するクエリと結合します。

と外側のクエリでは、あなたはUNIONで2つのクエリからnum値を組み合わせることSUM(num)またはMAX(num)を使用する必要があります。

SELECT T.id, fk_question_type, description, SUM(num) AS num, value, T2.totalAnswers 
FROM (
    (SELECT q.id, q.fk_question_type, q.description, COUNT(a.id) AS num, at.value 
    FROM answer a 
    LEFT JOIN question q ON a.`fk_question`=q.`id` 
    LEFT JOIN answer_type at ON at.id = a.`fk_answer_type` 
    GROUP BY q.id, at.id ORDER BY q.id, at.id) 
    UNION ALL 
    (SELECT q.id, q.fk_question_type, q.description, 0 AS num, at.value 
    FROM answer a 
    LEFT JOIN question q ON a.`fk_question`=q.`id` 
    LEFT JOIN answer_type at ON at.fk_question_type=q.fk_question_type 
    GROUP BY q.id, at.id ORDER BY q.id, at.id) 
) AS T 
JOIN (SELECT q.id, COUNT(*) AS totalAnswers 
     FROM answer a 
     LEFT JOIN question q ON a.`fk_question`=q.`id` 
     LEFT JOIN answer_type at ON at.id = a.`fk_answer_type` 
     GROUP BY q.id) AS t2 ON T.id = T2.id 
WHERE fk_question_type = 1 
GROUP BY T.id, value 

DEMO

+0

ありがとう!私はあなたの答えを受け入れた。 – EnricSV

関連する問題