2012-01-25 41 views
0

糾正這種查詢

SELECT (sum(`result` = 1)/count(id) * 100) as `abc`, 
case 
    when `abc` > 80 then 'pass' 
    when `abc` < 80 then 'fail' 
end as `abcd` 
FROM `user_quiz_answers` WHERE `user_quiz_id` = 39 

表:

id   int(11)   AUTO_INCREMENT         
question_id  int(11)            
result  tinyint(1) 

錯誤:

#1054 - Unknown column 'abc' in 'field list' 

我已成功這一點,但不是上面的一個

SELECT 
case 
    when (sum(`result` = 1)/count(id) * 100) > 80 then 'pass' 
    when (sum(`result` = 1)/count(id) * 100) < 80 then 'fail' 
end as `abcd` 
FROM `user_quiz_answers` WHERE `user_quiz_id` = 39 
+0

界定「不工作」 ...... –

+0

@MitchWheat# 1054 - '字段列表'中未知列'abc' – aWebDeveloper

+0

啊 - 你不能在你有的地方引用別名'abc' - 你需要再次複製那個SUM()語句。 – halfer

回答

3

因爲在同一個查詢中不能使用列別名作爲列名。 這樣的事情會工作

SELECT 
    `abc`, 
    case 
    when `abc` > 80 then 'pass' 
    when `abc` < 80 then 'fail' 
    end as `abcd` 
FROM (
    SELECT (sum(`result` = 1)/count(id) * 100) as `abc` 
    FROM `user_quiz_answers` WHERE `user_quiz_id` = 39 
) AS sq 

其他更簡單的方式做你似乎什麼想做的事是:

SELECT 
    IF((sum(`result` = 1)/count(id) * 100) > 80, 'pass','fail') as `abcd` 
FROM `user_quiz_answers` WHERE `user_quiz_id` = 39 
+0

刪除,在第9行。在第二種方法中是否存在性能問題,我使用了 – aWebDeveloper

+0

我不太確定優化器如何處理這個問題。這個查詢很簡單,在'BENCHMARK()'中運行它可以回答這個問題。 – Mchl

+0

也請查看更新的答案替代。 – Mchl