2016-05-26 6 views
1

私の望むようにクエリを取得するのに問題があります。私は2つのテーブルを持っています: 通路と質問の表関連するテーブルから2回カウントするmysqlクエリ

質問表には、通過の外来キーがあります。質問テーブルには、アクティブ、非アクティブ、またはレビューのいずれかのステータスの列があります。私は積極的な質問の数を得ることができましたが、今ではレビューの質問の数も得たいと思っていますが、それは正しいと思われます。以下は私がこれまでに思いついたことですが、questioninviewのコラムでは私にnumquestionsと同じ数字が与えられています。

SELECT 
p."id", 
COUNT(q."PassageId") as numQuestions, 
COUNT(q2."PassageId") AS questionsInReview, 
ROUND(AVG(q."level")) as "questionLevel" 
FROM 
"Passages" as p 
LEFT OUTER JOIN "Questions" as q ON p.id=q."PassageId" AND q."status" = 'active' 
LEFT OUTER JOIN "Questions" as q2 on p.id=q2."PassageId" where q2."status" = 'review' 
GROUP BY p.id 
ORDER BY p.id ASC 

質問の件数を確認するにはどうすればよいですか?

EDIT:(未テスト)のようなものについては何

SELECT 
    p.id, 
    SUM(CASE WHEN q."status" = 'active' THEN 1 ELSE 0 END) AS numQuestions, 
    SUM(CASE WHEN q."status" = 'review' THEN 1 ELSE 0 END) AS questionsInReview, 
    ROUND(AVG(CASE WHEN q."status" = 'active' THEN q."level" ELSE Null END)) as questionLevel 
FROM "Passages" AS p 
LEFT JOIN "Questions" as q ON p.id = q."PassageId" 
GROUP BY p.id 
ORDER BY p.id ASC 

答えて

1

:ここで提案されたもので遊んで後

は私が

ソリューションを動作するようになったものです

SELECT p.id, 
     COUNT(q.id) AS numQuestions, 
     SUM(q.status = "review") AS questionsInReview, 
     ROUND(AVG(if(q.status = "active", q.level, null)) as questionLevel 
FROM Passages AS p 
LEFT JOIN Questions as q ON p.id = q.PassageId AND q.status = 'active' 
GROUP BY p.id 
ORDER BY p.id ASC 
+0

これは私にとっては最も簡単な解決策でした。解決策を得るために質問を編集しました。このクエリを微調整して機能させるには – paulducsantos

1

あなたの答えの問題は、あなたがちょうど行を数えていることです行の数は同じです。

は、このアプローチを試してみてください:

SELECT id, sum(active) as sum_active, sum(review) as sum_review from (
    SELECT p.id, 
    CASE q.status WHEN 'active' 1 ELSE 0 AS active, 
    CASE q.status WHEN 'review' 1 ELSE 0 AS review 
    FROM Passages as p inner join Questions as q ON p.id = q.passageId 
) group by id 

内側のクエリをidea-だけアクティブとレビューのためにあなたのバイナリ列を与えるだろう。あなたは単純に結果を得るためにそれらを合計することができます。

関連する問題