Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用MySQL计算现有和不存在的值?_Mysql_Sql_Count - Fatal编程技术网

如何使用MySQL计算现有和不存在的值?

如何使用MySQL计算现有和不存在的值?,mysql,sql,count,Mysql,Sql,Count,我是MySQL新手 我有一个带有答案ID的表。 答案可以是这样的:a1,a2,a3…,但由于一些问题,有些是空的,有些是空的,还有一些像1A等 现在我想用a1和a3计算ID的计数。但是,如何才能做到这一点,留下空值、空白和垃圾等其他内容呢 输出应该如下所示 atype count a1 45 a2 0 a3 56 如果某个特定答案没有行条目,则计数应为0。解决方案1:两个查询 select a.atype,count(*) as `Count` from (

我是MySQL新手

我有一个带有答案ID的表。 答案可以是这样的:a1,a2,a3…,但由于一些问题,有些是空的,有些是空的,还有一些像1A等

现在我想用a1和a3计算ID的计数。但是,如何才能做到这一点,留下空值、空白和垃圾等其他内容呢

输出应该如下所示

atype count 
a1      45
a2       0
a3      56
如果某个特定答案没有行条目,则计数应为0。

解决方案1:两个查询
select a.atype,count(*) as `Count`
from
 (select 'a1' as atype union all
  select 'a2' as atype union all
  select 'a3' as atype )a
left join <your_table> b
on a.atype =b.atype
group by atype
您应该使用包含所需正确答案类型的表格:

| id | answer |
---------------
| 1  | a1     |
| 2  | a2     |
etc.
然后可以计算表中实际存在的结果:

SELECT atype, COUNT( * ) cnt FROM answers JOIN mytable 
    ON mytable.atype=answers.answer GROUP BY answers.answer;
用适当的表名替换mytable

当然,这只会返回现有结果。要计算零行数,可以查找表中未显示的答案:

SELECT answer, '0' AS cnt FROM answers WHERE answer NOT IN(
    SELECT DISTINCT answer FROM answers JOIN mytable WHERE answer=mytable.atype );
解决方案2:柜台 另一种方法是使用计数器表:

| id | answer | cnt |
---------------------
| 1  | a1     | 0   |
| 2  | a2     | 0   |
etc.
然后,每次要计算结果时,请执行以下操作:

UPDATE answers SET cnt=0;

UPDATE answers SET cnt=
    (SELECT cnt FROM 
        ((SELECT answers.answer, COUNT(*) AS cnt 
          FROM answers JOIN mytable ON answers.answer=myTable.aType 
          GROUP BY answers.answer) AS tbl) 
     WHERE answers.answer=tbl.answer) 
WHERE EXISTS 
    (SELECT cnt FROM 
        ((SELECT answers.answer, COUNT(*) AS cnt
          FROM answers JOIN mytable ON answers.answer=mytable.atype
          GROUP BY answers.answer) AS tbl) 
     WHERE answers.answer=tbl.answer);
这将更新答案表中的计数器值,您只需从答案中按答案顺序选择*即可获得结果

不过,请注意:我相信第二个版本虽然方便,但由于需要所有子查询,将比第一个版本占用更多的计算能力

更新语句在左侧

解决方案3:写入时更新 在我看来,对于像您这样的用例,最好也是最不需要性能的解决方案是创建一个计数器表,就像我在2中描述的那样,但是在用户回答问题时更新计数器值,而不是每次您想知道计数时都重新计算所有条目

这很容易做到。每次正确回答问题时,增加答案表中的计数器:

同样,您的查询将是

SELECT * FROM answers ORDER BY answer;

我试着展示所有的主要选择,每个查询后面都有演示链接。链接包含描述

select AType,count(*) as Count from tb2
where atype!='' and atype is not null and atype!='0' group by atype

第一个和最后一个链接不考虑数据中完全不存在的类型。例如,如果没有类型为a2的答案,那么第一个和第三个查询将只告诉类型为a1和a3的答案数量,而不会提及类型为atype=a2的答案。但是,第二次查询需要。

您是否确实需要0个计数,或者它们是否会完全丢失?如果您希望使用a1、a2、a3计算id的计数。。然后,您可以检查我的答案并演示搜索显式值,其中atype='a1',等将变得非常乏味,一旦您有多个答案要查询。Yes@weltraumpirat。在某种程度上你是对的。但我现在改变了趋势,使之变得非常普遍,这在五月份是徒劳的。你的答案很一般,但有点难,我认为jaya的要求很容易通过一个更简单/更短的解决方案得到满足。但堆栈溢出也意味着要成为其他人的知识库。我们给出的答案应该尽可能的笼统,以便尽可能多的有类似问题的人从中受益,或者——但愿如此——学习一些东西;我同意@weltraumpirat的观点,即答案应该是一般性的,以便对其他人也有用,并实际同意。。但是简单、简短和清晰在一般性之前,但在准确性之后。那么,为了准确起见,你必须考虑表count=0中不存在的正确答案,以及忽略不正确的结果——这只有你最后的和原始的陈述才有+1为出色的努力,请添加一个演示链接以及。因此,有人会被说服详细查看您的解决方案,因为它足够详细:我添加了解决方案1和2的示例。我相信,3是不言自明的。
select AType,count(*) as Count from tb2
where atype!='' and atype is not null and atype!='0' group by atype
select (select count(id) from tb2 where atype='a1') as A1,(select count(id) from
tb2 where atype='a2') as A2,(select count(id) from tb2 where atype='a3') as A3;
select AType,count(*) as Count from tb2
where atype in('a1','a2','a3') group by atype