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