[英]SQL case subquery + subquery > 0
我想用另一個數字來分配一個數字。 但是因為結果有可能是0我想說一個案例,如果它是0那么它應該是1,因為我創建了這個:
(CASE(SELECT COUNT(*)
FROM module_score
WHERE user_id = 40 AND medal_id > 1)
+
(SELECT COUNT(*)
FROM user_has_module_score uhms
WHERE user_id = 40 and medal_id > 1)> 0
THEN 1
ELSE 0 END) as passed_percentage
但是我得到以下語法錯誤:
medal_id > 1)> 0 THEN 1 ELSE 0 END) as passed_percentage
FROM system_learningbank.user U
WHERE U.id = 40 GROUP BY U.id
Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'THEN 1 ELSE 0 END) as passed_percentage FROM system_learningbank.user U WH' at line 7
那么如果驗證它不是0,那么正確的語法是什么? 在上面的示例中,我將變量設置為1,但這應該是子查詢的實際計數
我的完整sql語句
SELECT
(SELECT
COUNT(*)
FROM
module_score MS
WHERE
user_id = 40) + (SELECT
COUNT(UHMS.score)
FROM
user_has_module_score UHMS
WHERE
UHMS.user_id = 40) / ((SELECT
COUNT(*)
FROM
module_score
WHERE
user_id = 40 AND medal_id > 1) + (SELECT
COUNT(*)
FROM
user_has_module_score uhms
WHERE
user_id = 40 and medal_id > 1) > 0) as passed_percentageas
FROM
system_learningbank.user U
WHERE
U.id = 40
GROUP BY U.id;
你錯過了when
:
(CASE WHEN (SELECT COUNT(*) FROM module_score WHERE user_id = 40 AND medal_id > 1) +
(SELECT COUNT(*) FROM user_has_module_score uhms WHERE user_id = 40 and medal_id > 1) > 0
THEN 1 ELSE 0
END) as passed_percentage
MySQL將布爾值視為整數,因此您可以在沒有case
實際寫入:
( (SELECT COUNT(*) FROM module_score WHERE user_id = 40 AND medal_id > 1) +
(SELECT COUNT(*) FROM user_has_module_score uhms WHERE user_id = 40 and medal_id > 1) > 0
) as passed_percentage
編輯:
SELECT (SELECT COUNT(*)
FROM module_score MS
WHERE user_id = 40
) +
(SELECT COUNT(UHMS.score)
FROM user_has_module_score UHMS
WHERE UHMS.user_id = 40
) / ((SELECT COUNT(*)
FROM module_score
WHERE user_id = 40 AND medal_id > 1
) +
(SELECT COUNT(*)
FROM user_has_module_score uhms
WHERE user_id = 40 and medal_id > 1
) > 0
) as passed_percentageas
FROM system_learningbank.user U
WHERE U.id = 40
GROUP BY U.id;
我懷疑你想要更像這樣的東西:
SELECT ((ms.cnt + hms.cnt) /
(case when ms.cnt_m1 + hms.cnt_m2 > 0 then ms.cnt_m1 + hms.cnt_m2 end)
) as passed_percentageas
FROM system_learningbank.user U left join
(select userid, count(*) as cnt, sum(medal_id > 1) as cnt_m1
from module_score
group by user_id
) ms
on ms.user_id = u.user_id left join
(select userid, count(*) as cnt, sum(medal_id > 1) as cnt_m1
from user_has_module_score
group by user_id
) hms
on hms.user_id = u.user_id
WHERE U.id = 40;
但是,這仍然看起來很可疑。 。 。 表名表明只有一個真正編碼你想要的分數,分母比分子更具限制性,但這種結構基本上是你想要的。 GROUP BY U.id;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.