计算MySQL中民意调查的答案总数

时间:2009-09-02 15:39:18

标签: mysql group-by

我尝试了不同的方法,但即使我认为我的语法没问题,查询也不起作用。

我有一个相当复杂的民意调查系统。一般来说,民意调查的每个答案都被放在一个表中

CREATE TABLE `polls` (
  `poll_id` int(10) NOT NULL auto_increment,
  `client_id` int(10) NOT NULL,
  `key` varchar(20) NOT NULL,
  `val` varchar(30) NOT NULL,
  PRIMARY KEY  (`poll_id`)
);

'key'列就像某个问题的ID一样(比如'你经常喝咖啡'关键是'咖啡'),价值根据问题而变化 - 有时是0或1,有时是0-6,有时它是一些字符串。 出于统计目的,我想显示每个问题的每个答案的百分比。我使用此查询:

SELECT p.`key`, p.val, COUNT(p.poll_id) AS people, 
(SELECT COUNT(client_id) FROM clients) AS total 
FROM polls AS p GROUP BY p.`key`, p.val ORDER BY p.`key`, p.val

此查询中的问题是我依赖于clients表来获取用户总数 - 当每个用户回答每个问题时都会有效。现在我们又向民意调查添加了一个问题,但查询无法正常运行,因为现在不是每个用户都回答了这个问题,但百分比就像每个用户都回答一样。

我尝试将查询修改为类似的东西(我尝试了不同的方法,但让我们说出来了):

SELECT p.`key`, p.val, COUNT(p.poll_id) AS people, 
(SELECT COUNT(p2.poll_id) FROM polls AS p2 WHERE p2.`key` = p.`key`) AS total 
FROM polls AS p GROUP BY p.`key`, p.val ORDER BY p.`key`, p.val

我看到它的方式 - 它应该从主查询中获取所有值,对其进行分组然后执行子查询 - 所以我会得到类似的结果:

coffee , 0 , 10 , 30
coffee , 1 , 15 , 30
coffee , 2 , 5 , 30
tea , 0 , 5 , 25
tea , 1 , 5 , 25
tea , 3 , 5 , 25
tea , 4 , 10 , 25

最后一列将计算具有相同键的所有行并忽略val列(对于咖啡 - > 10 + 15 + 5 = 30,对于茶 - > 5 + 5 + 5 + 10 = 25)。查询未执行。它正在运行,运行和运行,最终我必须取消它。我感觉问题出现在子查询的“p2。key = p。key”部分,因为如果我写“p2。key ='coffee'”,查询就会运行喜欢魅力。

2 个答案:

答案 0 :(得分:0)

那你想算些什么?总共有多少答案?那就简单了:

SELECT COUNT(*) `count`
  FROM `polls`

但也许我明白你错了......

答案 1 :(得分:0)

这不是我问题的实际答案,但由于没有答案 - 也许我不可能只在一个查询中做我想要的事情。但是可以做类似的事情:

SELECT p.`key`, p.val, COUNT(p.poll_id) AS people 
FROM polls AS p GROUP BY p.`key`, p.val WITH ROLLUP

它将使用相同的GROUP BY列对值进行求和,并使用groups column = NULL添加总计数。我的问题的结果看起来像这样:

coffee , 0 , 10
coffee , 1 , 15
coffee , 2 , 5
coffee , NULL , 30
tea , 0 , 5
tea , 1 , 5
tea , 3 , 5
tea , 4 , 10
tea , NULL , 25
NULL , NULL , 55

我必须更改我的应用程序的实现以匹配从数据库获得的内容,但它适用于我。