Mysql 从投票表中提取投票数

Mysql 从投票表中提取投票数,mysql,sql,Mysql,Sql,我有两张桌子: create table `polls`( `pollid` smallint unsigned not null auto_increment, `question` varchar(40) not null, `answer1` varchar(30) not null, `answer2` varchar(30) not null, `answer3` varchar(30) default null, `answer4` varchar(30) default null,

我有两张桌子:

create table `polls`(
`pollid` smallint unsigned not null auto_increment,
`question` varchar(40) not null,
`answer1` varchar(30) not null,
`answer2` varchar(30) not null,
`answer3` varchar(30) default null,
`answer4` varchar(30) default null,
`answer5` varchar(30) default null,
primary key(`pollid`)
);

create table `poll_votes`(
`void` mediumint unsigned not null auto_increment,
`pollid` smallint unsigned not null,
`ip_address` varchar(15) not null,
`answer` tinyint unsigned not null,
primary key(`void`),
foreign key(`pollid`) references `polls`(`pollid`)
);
在poll_vots.answer中,我存储整数1-5,即用户投票的答案


我想使用单个查询在一行中检索所有5个答案的票数。

您可以在此处使用条件聚合:

SELECT
    SUM(CASE WHEN answer = 1 THEN 1 ELSE 0 END) AS num_answer_1,
    SUM(CASE WHEN answer = 2 THEN 1 ELSE 0 END) AS num_answer_2,
    SUM(CASE WHEN answer = 3 THEN 1 ELSE 0 END) AS num_answer_3,
    SUM(CASE WHEN answer = 4 THEN 1 ELSE 0 END) AS num_answer_4,
    SUM(CASE WHEN answer = 5 THEN 1 ELSE 0 END) AS num_answer_5
FROM poll_votes;
要获取每个pollid的这些摘要统计信息,请使用:

SELECT
    pollid,
    SUM(CASE WHEN answer = 1 THEN 1 ELSE 0 END) AS num_answer_1,
    SUM(CASE WHEN answer = 2 THEN 1 ELSE 0 END) AS num_answer_2,
    SUM(CASE WHEN answer = 3 THEN 1 ELSE 0 END) AS num_answer_3,
    SUM(CASE WHEN answer = 4 THEN 1 ELSE 0 END) AS num_answer_4,
    SUM(CASE WHEN answer = 5 THEN 1 ELSE 0 END) AS num_answer_5
FROM poll_votes
GROUP BY
    pollid;

您可以在此处使用条件聚合:

SELECT
    SUM(CASE WHEN answer = 1 THEN 1 ELSE 0 END) AS num_answer_1,
    SUM(CASE WHEN answer = 2 THEN 1 ELSE 0 END) AS num_answer_2,
    SUM(CASE WHEN answer = 3 THEN 1 ELSE 0 END) AS num_answer_3,
    SUM(CASE WHEN answer = 4 THEN 1 ELSE 0 END) AS num_answer_4,
    SUM(CASE WHEN answer = 5 THEN 1 ELSE 0 END) AS num_answer_5
FROM poll_votes;
要获取每个pollid的这些摘要统计信息,请使用:

SELECT
    pollid,
    SUM(CASE WHEN answer = 1 THEN 1 ELSE 0 END) AS num_answer_1,
    SUM(CASE WHEN answer = 2 THEN 1 ELSE 0 END) AS num_answer_2,
    SUM(CASE WHEN answer = 3 THEN 1 ELSE 0 END) AS num_answer_3,
    SUM(CASE WHEN answer = 4 THEN 1 ELSE 0 END) AS num_answer_4,
    SUM(CASE WHEN answer = 5 THEN 1 ELSE 0 END) AS num_answer_5
FROM poll_votes
GROUP BY
    pollid;

如果您想使用一个pollid 试试这个


如果您想使用一个pollid 试试这个


MySQL有一个非常方便的用于此类计数的简写符号:

SELECT SUM(answer = 1) AS num_answer_1,
       SUM(answer = 2) AS num_answer_2,
       SUM(answer = 3) AS num_answer_3,
       SUM(answer = 4) AS num_answer_4,
       SUM(answer = 5) AS num_answer_5
FROM poll_votes;

也就是说,布尔值在算术上下文中被视为数字,1表示true,0表示false。

MySQL有一个非常方便的用于此类计数的简写符号:

SELECT SUM(answer = 1) AS num_answer_1,
       SUM(answer = 2) AS num_answer_2,
       SUM(answer = 3) AS num_answer_3,
       SUM(answer = 4) AS num_answer_4,
       SUM(answer = 5) AS num_answer_5
FROM poll_votes;

这是,布尔值在算术上下文中被处理为数字,1为真,0为false。< /P>每当您发现上面列举的列名时,比如说,2,当您发现上面列举的列名时,您的模式设计是否是最优的,例如,2考虑你的模式设计是否是最优的,如果我添加POLLID来选择语句来获得我正在查看的结果,我会收到这个错误:错误代码:1140。在没有分组依据的聚合查询中,选择列表的表达式1包含未聚合的列“poll_voces.pollid”;这与sql_mode=only_full_group_不兼容,因为在轮询中有多条记录。如果我将pollid添加到select语句以获取查看结果的轮询,我将收到以下错误:错误代码:1140。在没有分组依据的聚合查询中,选择列表的表达式1包含未聚合的列“poll_voces.pollid”;这与sql_mode=only_full_group_不兼容,因为在轮询中有多条记录。