4

我是 MySQL 新手。

我有一张带有答案 ID 的表格。答案可能如下所示:a1, a2, a3 ...,但由于某些问题,有些是NULL,有些是空白的,有些是其他类似的1 a等等。

a1 a2 a3现在我想清楚地计算 ids 的数量。但是如何做到这一点,留下其他人喜欢NULL,空白和垃圾。

输出应如下所示

atype count 
a1      45
a2       0
a3      56

如果特定答案没有行条目,则计数应为 0。

4

3 回答 3

3

解决方案 1:两个查询

您应该使用包含所需(正确)答案类型的表格:

| 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);

这将更新您的答案表中的计数器值,您SELECT * FROM answers ORDER BY answer可以获得结果。

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

这是这个例子(更新语句在左边!)

解决方案 3:写入时更新

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

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

UPDATE answers SET cnt=cnt+1 WHERE answers.answer='a1';

再次,您的查询将是

SELECT * FROM answers ORDER BY answer;
于 2012-11-15T06:26:29.463 回答
0
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
于 2012-11-15T06:13:41.317 回答
0

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

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

Link1 (Best One) 计算除 balank 0 和 null 之外的每个(现有)类型的答案

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;

Link2(简单且最适合您)仅计算 a1、a2 或 a3 类型的答案(我的旧方法获得与 link3 相似的结果)

select AType,count(*) as Count from tb2
where atype in('a1','a2','a3') group by atype

Link3 只计算 a1、a2 或 a3 类型的答案。

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

于 2012-11-15T07:43:58.643 回答