2014-11-06 78 views
1

我有一个48列的mysql表。表中的值将是“是”或“否”。我想要从一行中得到“是”和“否”的数目。来自mysql数据库表行的是和否值的总数

例如:

一个具有23个是年代和25号的行,那么就应该在前端显示的总数 enter image description here

+0

发表您的查询。 – 2014-11-06 08:49:24

+0

''''SELECT answer,count(*) FROM yourTable GROUP BY answer''''? – 2014-11-06 08:49:35

+0

感谢您的回复。计数应该基于该行。 – user2372469 2014-11-06 08:52:08

回答

3

所以,你的表是这样的:

id  p_id  answer1 answer2 answer3 ....etc 
-------------------------------------------------- 
1  123  yes  no  yes 

不要这样做!这不是关系数据库的工作方式。您将串行数据存储在行中,而不是列中。这将是更好的正常化表和每个答案存储在一个单独的行:

p_id  answer value 
----------------------- 
123  1  yes 
123  2  no 
123  3  yes 

现在你可以很容易地计算特定ID yes/no答案:

SELECT value, COUNT(*) FROM yourTable WHERE p_id=123 GROUP BY value 

如果你必须坚持你目前的结构,唯一合理的选择是SELECT *并在php中进行计数。在Mysql中没有直接的方法来以每列为基础计算值。

+0

格奥尔格,我会用我的数据库表格截图更新我的问题,那么你可以很容易地理解什么是要求 – user2372469 2014-11-06 09:02:10

+0

@ user2372469:谢谢,我已经更新了答案。 – georg 2014-11-06 09:07:21

+0

我想要从那一行中得到yes和no的总数 – user2372469 2014-11-06 09:11:13

0
SELECT col1 + col2 + ... + col48 as yes, * FROM table_name 

我希望你的表结构会支持这个;

我从来没有尝试过,但我以this answer作为参考。

编辑
忘记,如果你更改列到emun大部分代码仍然可能会工作,而我的查询就可以了(只要确保没有首先在枚举),以mention-

0

使用您当前的结构唯一可行的方法是检查每列,如果选择“是”,则添加1;如果选择“否”,则选择0。

SELECT id, p_id, 
     IF(Analysis1 = 'Yes', 1, 0) + 
     IF(Analysis2 = 'Yes', 1, 0) + 
     IF(Analysis3 = 'Yes', 1, 0) + 
     IF(Analysis4 = 'Yes', 1, 0) + 
     IF(Analysis5 = 'Yes', 1, 0) + 
     IF(Analysis6 = 'Yes', 1, 0) + 
     IF(Analysis7 = 'Yes', 1, 0) + 
     IF(Analysis8 = 'Yes', 1, 0) + 
     IF(Analysis9 = 'Yes', 1, 0) + 
     IF(Analysis10 = 'Yes', 1, 0) + 
     IF(Analysis11 = 'Yes', 1, 0) + 
     IF(Analysis12 = 'Yes', 1, 0) + 
     IF(Analysis13 = 'Yes', 1, 0) + 
     IF(Analysis14 = 'Yes', 1, 0) + 
     IF(Analysis15 = 'Yes', 1, 0) + 
     IF(Analysis16 = 'Yes', 1, 0) + 
     IF(Analysis17 = 'Yes', 1, 0) + 
     IF(Analysis18 = 'Yes', 1, 0) + 
     IF(Analysis19 = 'Yes', 1, 0) + 
     IF(Analysis20 = 'Yes', 1, 0) + 
     IF(Analysis21 = 'Yes', 1, 0) + 
     IF(Analysis22 = 'Yes', 1, 0) + 
     IF(Analysis23 = 'Yes', 1, 0) + 
     IF(Analysis24 = 'Yes', 1, 0) + 
     IF(Analysis25 = 'Yes', 1, 0) + 
     IF(Analysis26 = 'Yes', 1, 0) + 
     IF(Analysis27 = 'Yes', 1, 0) + 
     IF(Analysis28 = 'Yes', 1, 0) + 
     IF(Analysis29 = 'Yes', 1, 0) + 
     IF(Analysis30 = 'Yes', 1, 0) + 
     IF(Analysis31 = 'Yes', 1, 0) + 
     IF(Analysis32 = 'Yes', 1, 0) + 
     IF(Analysis33 = 'Yes', 1, 0) + 
     IF(Analysis34 = 'Yes', 1, 0) + 
     IF(Analysis35 = 'Yes', 1, 0) + 
     IF(Analysis36 = 'Yes', 1, 0) + 
     IF(Analysis37 = 'Yes', 1, 0) + 
     IF(Analysis38 = 'Yes', 1, 0) + 
     IF(Analysis39 = 'Yes', 1, 0) + 
     IF(Analysis40 = 'Yes', 1, 0) + 
     IF(Analysis41 = 'Yes', 1, 0) + 
     IF(Analysis42 = 'Yes', 1, 0) + 
     IF(Analysis43 = 'Yes', 1, 0) + 
     IF(Analysis44 = 'Yes', 1, 0) + 
     IF(Analysis45 = 'Yes', 1, 0) + 
     IF(Analysis46 = 'Yes', 1, 0) + 
     IF(Analysis47 = 'Yes', 1, 0) + 
     IF(Analysis48 = 'Yes', 1, 0) AS YesCnt, 
     IF(Analysis1 = 'No', 1, 0) + 
     IF(Analysis2 = 'No', 1, 0) + 
     IF(Analysis3 = 'No', 1, 0) + 
     IF(Analysis4 = 'No', 1, 0) + 
     IF(Analysis5 = 'No', 1, 0) + 
     IF(Analysis6 = 'No', 1, 0) + 
     IF(Analysis7 = 'No', 1, 0) + 
     IF(Analysis8 = 'No', 1, 0) + 
     IF(Analysis9 = 'No', 1, 0) + 
     IF(Analysis10 = 'No', 1, 0) + 
     IF(Analysis11 = 'No', 1, 0) + 
     IF(Analysis12 = 'No', 1, 0) + 
     IF(Analysis13 = 'No', 1, 0) + 
     IF(Analysis14 = 'No', 1, 0) + 
     IF(Analysis15 = 'No', 1, 0) + 
     IF(Analysis16 = 'No', 1, 0) + 
     IF(Analysis17 = 'No', 1, 0) + 
     IF(Analysis18 = 'No', 1, 0) + 
     IF(Analysis19 = 'No', 1, 0) + 
     IF(Analysis20 = 'No', 1, 0) + 
     IF(Analysis21 = 'No', 1, 0) + 
     IF(Analysis22 = 'No', 1, 0) + 
     IF(Analysis23 = 'No', 1, 0) + 
     IF(Analysis24 = 'No', 1, 0) + 
     IF(Analysis25 = 'No', 1, 0) + 
     IF(Analysis26 = 'No', 1, 0) + 
     IF(Analysis27 = 'No', 1, 0) + 
     IF(Analysis28 = 'No', 1, 0) + 
     IF(Analysis29 = 'No', 1, 0) + 
     IF(Analysis30 = 'No', 1, 0) + 
     IF(Analysis31 = 'No', 1, 0) + 
     IF(Analysis32 = 'No', 1, 0) + 
     IF(Analysis33 = 'No', 1, 0) + 
     IF(Analysis34 = 'No', 1, 0) + 
     IF(Analysis35 = 'No', 1, 0) + 
     IF(Analysis36 = 'No', 1, 0) + 
     IF(Analysis37 = 'No', 1, 0) + 
     IF(Analysis38 = 'No', 1, 0) + 
     IF(Analysis39 = 'No', 1, 0) + 
     IF(Analysis40 = 'No', 1, 0) + 
     IF(Analysis41 = 'No', 1, 0) + 
     IF(Analysis42 = 'No', 1, 0) + 
     IF(Analysis43 = 'No', 1, 0) + 
     IF(Analysis44 = 'No', 1, 0) + 
     IF(Analysis45 = 'No', 1, 0) + 
     IF(Analysis46 = 'No', 1, 0) + 
     IF(Analysis47 = 'No', 1, 0) + 
     IF(Analysis48 = 'No', 1, 0) AS NoCnt 
FROM iv_checklist 

如果数据库是更好的设计,与这些列,每列作为一个单独的表中的行那么这将是非常简单和快速的事情。

+1

这确实是很有趣打字)) – georg 2014-11-06 09:53:48

+0

不会打字太多,太懒惰!写一行,复制10次,得到1到10个版本。然后复制这10行5次,只需添加十位数字即可。然后复制/粘贴全部'No'并选择它,并在选择中将'yes'更改为'no'。 – Kickstart 2014-11-06 09:55:53

0

考虑下表

id  answer  
------------ 
1  YES 
2  NO 
3  YES 

查询将是..

select sum(if(answer='YES',1,0))as yes, 
sum(if(answer='NO',1,0))as no from test; 

你会得到像下面

+------+------+ 
| yes | no | 
+------+------+ 
| 5 | 1 | 
+------+------+ 

如果你想要得到的结果行的答案按行申请分组查询..

select id,sum(if(answer='YES',1,0))as yes, 
sum(if(answer='NO',1,0))as no from test group by id; 

那么结果将是

+------+------+ 
| yes | no | 
+------+------+ 
| 2 | 0 | 
| 2 | 0 | 
| 1 | 1 | 
+0

请让我知道它是否按预期工作... – vipin 2014-11-06 10:05:30

相关问题