Mysql
具有分組依據的子查詢返回超過 1 行問題
我面臨子查詢返回超過 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(..)
withCASE .. 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
而不是NULL
在ELSE
for 部分中SUM(..)
。