SELECT difficult_level,COUNT(IF(result='right',1,NULL))/COUNT(qpd.question_id) correct_rate
FROM  question_detail qd, question_practice_detail qpd,user_profile up
WHERE up.device_id=qpd.device_id and qpd.question_id=qd.question_id and
university='浙江大学'
GROUP BY difficult_level
ORDER BY correct_rate;

好奇怪和上一题一样,COUNT(IF(result='right',1,0))不对。?
另外上面的这个写法简单粗暴地把三个表连接了起来。可以做得更精细一点,减少笛卡尔积的运算量。

SELECT difficult_level,COUNT(IF(result='right',1,NULL))/COUNT(qpd.question_id) correct_rate
FROM 
(SELECT device_id FROM user_profile WHERE university='浙江大学') a
INNER JOIN question_practice_detail qpd
ON a.device_id=qpd.device_id

INNER JOIN question_detail qd
ON qpd.question_id=qd.question_id
GROUP BY difficult_level
ORDER BY correct_rate;

mark一下,(SELECT device_id FROM user_profile WHERE university='浙江大学')要另外取个表名a,不然会报错。