我尝试了不同的方法,但即使我认为我的语法没问题,查询也不起作用。
我有一个相当复杂的民意调查系统。一般来说,民意调查的每个答案都被放在一个表中
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'”,查询就会运行喜欢魅力。
答案 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
我必须更改我的应用程序的实现以匹配从数据库获得的内容,但它适用于我。