如何在mysql中选择字段值相同的记录数与记录数的比值?

vddsk6oq  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(603)

假设我在mysql数据库中有一个表

(id,idWord,isCorrect)
------------------
('1','1', '0'),
('2','1', '1'),
('3','1', '1'),
('4','1', '1'),
('5','1', '0'),
('6','1', '1'),

('7','2', '0'),
('8','2', '0'),
('9','2', '1'),
('10','2', '1')

如何选择iscorrect=1的记录数与具有相同idword的记录总数之间的比率?在这种情况下会导致

('1','0.6')     (-> 4/6)
('2','0.5')     (-> 2/4)

我试过了

SELECT 
  (SELECT COUNT(`isCorrect`) FROM `wordstyped` GROUP BY `idWord`,`isCorrect`) 
  / 
  (SELECT COUNT(`isCorrect`) FROM `wordstyped` GROUP BY `idWord`,`isCorrect` WHERE `isCorrect`=1)

但它不起作用。
http://www.sqlfiddle.com/#!9/f36c58/1型

f8rj6qna

f8rj6qna1#

当你使用 SELECT 作为一个值,它只能返回一行,不能返回所有分组的行。您可以通过一个查询来完成它,该查询对多个内容求和。

SELECT idWord, SUM(isCorrect = 1) / COUNT(*) AS ratio
FROM `wordstyped`
GROUP BY idWord

像这样的比较表达式 isCorrect = 1 计算结果为 1 如果是真的, 0 如果为false,那么求和将计算条件为true的行数。
您也可以使用 AVG() 函数,因为平均值只是总数除以计数。

SELECT idWord, AVG(isCorrect = 1) AS ratio
FROM `wordstyped`
GROUP BY idWord
eqoofvh9

eqoofvh92#

试试这个:

SELECT
    idWord,
    SUM(CASE WHEN isCorrect = 1 THEN 1 ELSE 0 END) AS corrects,
    COUNT(*) AS total,
    SUM(CASE WHEN isCorrect = 1 THEN 1 ELSE 0 END) / COUNT(*) AS ratio
FROM
    wordstyped
GROUP BY
    idWord

相关问题