2015-09-09 56 views
0

%的表的所有條目比方說,我們有以下模型:MySQL的:獲取計數,並與給定的條件

  • 練習(ID,姓名)的表
  • 用戶的表(ID姓名,電子郵件)考試
  • 一個表(ID,USER_ID,日)
  • 聯接考試和練習(exam_id間表,exercise_id)

  • 每個用戶都可以使Ø每天考試。

  • 每個考試都是由很多練習組成的(擁有並且屬於很多)。

對於每個用戶(登錄時),我想顯示一個表格,顯示所有練習以及每個用戶在給定時間段內進行的考試次數和百分比(使用考試)。

在這個時候,我可以顯示用戶在下面的查詢中給出的所有練習以及他們在給定時間內的百分比。

SELECT 
     o.user_id, 
     o.exercise_id, 
     o.exercise_name, 
     COUNT(*) AS nb_exams, 
     (COUNT(*) * 100/(
      SELECT COUNT(*) 
      FROM exams 
       LEFT JOIN users ON exams.user_id = users.id 
      WHERE users.id = 1 AND exams.day >= "2015-09-01" AND exams.day <= "2015-09-07" 
     )) AS percent 
    FROM (
     SELECT 
      exercises.id AS exercise_id, 
      exercises.name AS exercise_name, 
      exams.id AS exam_id, 
      users.id AS user_id 
     FROM exercises 
      LEFT JOIN exercises_exams ON exercises_exams.exercise_id = exercises.id 
      LEFT JOIN exams ON exercises_exams.exam_id = exams.id 
      LEFT JOIN users ON exams.user_id = users.id 
     WHERE users.id = 1 AND exams.day >= "2015-09-01" AND exams.day <= "2015-09-07" 
     GROUP BY exercise_id,exam_id 
    ) AS o 
    GROUP BY exercise_id; 

但我也想爲0

一個值,顯示他沒有練習又是否有可能與MySQL的一個查詢做到這一點?

編輯 -

這裏是sqlfiddle當前查詢。你會注意到只有3次在考試中使用的練習被返回。我想列出所有與計數和百分比(甚至是第四位0)

+0

能否請您就此成立一個SQL小提琴? –

+0

@vkp我編輯了我的問題與sqlfiddle – obo

回答

1

首先練習,你應該刪除where條件在內的查詢join條款看0結果當鍛鍊WASN」 t執行。獲取與0結果對應的user_id沒有任何意義。這是我能想到的最接近的解決方案。

Fiddle

SELECT 
    o.user_id, 
    o.exercise_id, 
    o.exercise_name, 
    sum(case when exam_id is null then 0 else 1 end) AS nb_exams, 
    (sum(case when exam_id is null then 0 else 1 end) * 100/(
     SELECT COUNT(*) 
     FROM exams 
     LEFT JOIN users ON exams.user_id = users.id 
    where exams.day >= "2015-09-01" AND exams.day <= "2015-09-07" 
    )) AS percent 
FROM (
    SELECT 
     exercises.id AS exercise_id, 
     exercises.name AS exercise_name, 
     exams.id AS exam_id , 
     users.id AS user_id 
    FROM exercises 
     LEFT JOIN exercises_exams ON exercises_exams.exercise_id = exercises.id 
     LEFT JOIN exams ON exercises_exams.exam_id = exams.id 
     and exams.day >= "2015-09-01" AND exams.day <= "2015-09-07" 
     LEFT JOIN users ON exams.user_id = users.id 
) AS o 
GROUP BY exercise_id,exercise_name 
+0

感謝您的答案。獲得給定用戶的0結果對我來說是有意義的,因爲我想向用戶展示他在考試期間沒有做過的練習,並且有一種方法可以根據百分比對結果進行排序。 – obo

+0

嘗試已更新的小提琴中的修改後的查詢 –