Mysql

具有分組依據的子查詢返回超過 1 行問題

  • September 17, 2019

我面臨子查詢返回超過 1 行的問題,因為我在子查詢和外部查詢中都使用 group by 來獲得所需的結果。

這是我的查詢

SELECT Count(*)                                       AS totalCat,
      attempted_questions.category_id_fk,
      (SELECT Count(*)
       FROM   attempted_questions
       WHERE  attempted_questions.correct = 1
       GROUP  BY attempted_questions.category_id_fk) AS correct
FROM   attempted_questions
GROUP  BY attempted_questions.category_id_fk

我想從該表中針對類別獲取總問題數和總正確問題數,如下面的結果。

  Category   Total_Questions   Total_Correct
     1             4                 3
     2             3                 1

上面提到的是我的查詢所需的結果,但它對我不起作用,我試圖修復它但找不到任何解決方案。

請查看我附加的圖片以查看數據庫記錄和表結構。

在此處輸入圖像描述

而不是使用子查詢來獲取“正確問題的計數”,您可以使用條件聚合利用主查詢本身中的CASE .. WHEN語句來獲得相同的計數:COUNT(..)

SELECT category_id_fk AS category, 
      Count(*) AS total_questions,
      Count(CASE WHEN correct = 1 THEN 1 ELSE NULL END) AS total_correct
FROM   attempted_questions
GROUP  BY category

COUNT(NULL)返回 0;因此,如果嘗試的問題不正確(ELSE條件反對WHERE correct = 1),我們會返回NULL以避免將其視為正確。


另一種可能性是使用SUM(..)with CASE .. WHEN。我們還可以利用MySQL 將 boolean 隱式類型轉換為 int

SELECT category_id_fk AS category, 
      Count(*) AS total_questions,
      SUM(correct = 1) AS total_correct
FROM   attempted_questions
GROUP  BY category

correct = 1對於正確和不正確的問題,分別返回 True 或 False。在SUM(..)對這些布爾值進行操作期間,MySQL 隱式地將 true 類型轉換為 1,將 false 類型轉換為 0;從而給我們所需的計數。

您也可以用 SQL 標準方式編寫它(通過避免隱式類型轉換),如下所示:

SELECT category_id_fk AS category, 
      Count(*) AS total_questions,
      SUM(CASE WHEN correct = 1 THEN 1 ELSE 0 END) AS total_correct
FROM   attempted_questions
GROUP  BY category

與這裡方法的唯一區別COUNT(..)是我們返回它0而不是NULLELSEfor 部分中SUM(..)

引用自:https://dba.stackexchange.com/questions/248946