我是 MySQL 新手。
我有一张带有答案 ID 的表格。答案可能如下所示:a1, a2, a3 ...
,但由于某些问题,有些是NULL
,有些是空白的,有些是其他类似的1 a
等等。
a1 a2 a3
现在我想清楚地计算 ids 的数量。但是如何做到这一点,留下其他人喜欢NULL
,空白和垃圾。
输出应如下所示
atype count
a1 45
a2 0
a3 56
如果特定答案没有行条目,则计数应为 0。
您应该使用包含所需(正确)答案类型的表格:
| 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 );
另一种方法是使用计数器表:
| 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
可以获得结果。
但是请注意:我相信第二个版本虽然方便,但由于需要所有子查询,因此将比第一个版本占用更多的计算能力。
这是这个例子(更新语句在左边!)
在我看来,对于像你这样的用例,最好和性能最低的解决方案是创建一个计数器表,就像我在 #2 中描述的那样,但是在用户回答问题时更新计数器值,而不是重新每次您想知道计数时计算所有条目。
这很容易做到。每次正确回答问题时,增加answers
表中的计数器:
UPDATE answers SET cnt=cnt+1 WHERE answers.answer='a1';
再次,您的查询将是
SELECT * FROM answers ORDER BY answer;
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
我试图展示所有主要的选择,每个查询后面都有演示链接。链接包含说明
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
第一个和最后一个链接不考虑那些完全不存在于数据中的类型。例如,如果没有 a2 类型的答案,那么第一个和第三个查询将只告诉类型 a1 和 a3 的答案数量,并且不会提及 atype=a2 的答案。但是第二个查询确实如此。