我有一个MySQL表,其中包含115个这样的字段:
v1q1 v1q2 v2q1 v2q2 v3q1 v3q3 (...)
记录都包含值0,1,2,3或4中的一个。
现在我需要为每个字段计算包含0的记录数,包含1的记录数,包含2的记录数,...(直到4)。
我如何以一种相当有效的方式实现这一目标?
答案 0 :(得分:3)
您可以使用IF
语句并执行sum
,如下所示:
SELECT
SUM(IF(v1q1=0, 1, 0)) as cnt0,
SUM(IF(v1q1=1, 1, 0)) as cnt1,
SUM(IF(v1q1=2, 1, 0)) as cnt2,
SUM(IF(v1q1=3, 1, 0)) as cnt3,
SUM(IF(v1q1=4, 1, 0)) as cnt4
FROM `myTable`
答案 1 :(得分:3)
你不能以任何有效的方式做到这一点。数据库本身的布局效率低下,无法通过任何类型的查询来解决这个问题。
帕特里克向您展示了如何在表格中的单个字段中执行此操作。现在创建一个包含115次的查询...如您所见,这样效率不高。您应该在表格中拥有现在您在字段名称中拥有的数据所在数据所属的值;在字段中:
id v q value
-------------
1 1 1 2
1 1 2 4
1 2 1 0
1 2 2 1
1 3 1 3
1 3 3 2
2 1 1 0
2 1 2 1
2 1 2 0
2 2 1 4
...
现在您已将所有数据作为实际数据,您可以有效地获取信息:
select v, q, value, count(*)
from TheTable
group by v, q, value