如何在mysql中选择记录计数与具有相同字段值的记录计数之间的比率?



假设我在 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

当您使用SELECT作为值时,它必须只返回一行,您不能返回所有分组的行。您可以使用对多个事物求和的单个查询来完成此操作。

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

isCorrect = 1这样的比较表达式的计算结果为1何时为真,0何时为假,因此将它们相加会计算条件为真的行数。

您也可以使用AVG()函数,因为平均值只是总数除以计数。

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

试试这个:

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

最新更新