簡體   English   中英

SQL case子查詢+子查詢> 0

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM