Reputation:
I have a mysql table with 48 columns. The values in the table will be either "yes" or "no". I want to get the number of yes's and no's from a row.
For example:
One row having 23 Yes's and 25 No's, then it should display the total count at the front end
Upvotes: 1
Views: 3039
Reputation: 98
SELECT col1 + col2 + ... + col48 as yes, * FROM table_name
I'm hoping your table structure will support this;
I've never tried it, but I'm taking this answer as a reference.
EDIT
Forgot to mention- if you change columns to an emun most of your code will probably still work, and my query will do the trick (just make sure no is first in the enum)
Upvotes: 0
Reputation: 877
Consider the following table
id answer
------------
1 YES
2 NO
3 YES
The query will be..
select sum(if(answer='YES',1,0))as yes,
sum(if(answer='NO',1,0))as no from test;
You will get the answer like below
+------+------+
| yes | no |
+------+------+
| 5 | 1 |
+------+------+
If you want to get the result row by row please apply group by with the query..
select id,sum(if(answer='YES',1,0))as yes,
sum(if(answer='NO',1,0))as no from test group by id;
So the result will be
+------+------+
| yes | no |
+------+------+
| 2 | 0 |
| 2 | 0 |
| 1 | 1 |
Upvotes: 4
Reputation: 21523
The only realistic way to do it with your current structure is checking each column and adding 1 if 'Yes' and 0 if 'No'.
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
If the database was better designed, with these columns each as a row on a separate table then this would be very simple and fast to do.
Upvotes: 0
Reputation: 214979
So your table is like this:
id p_id answer1 answer2 answer3 ....etc
--------------------------------------------------
1 123 yes no yes
Don't do that! This is not how relational databases work. You store serial data in rows, not in columns. It will be much better to normalize the table and store each answer in a separate row:
p_id answer value
-----------------------
123 1 yes
123 2 no
123 3 yes
Now you can easily count yes/no
answers for a specific ID:
SELECT value, COUNT(*) FROM yourTable WHERE p_id=123 GROUP BY value
If you have to stick with your current structure, the only reasonable option is to SELECT *
and do the counting in php. There's no direct way in Mysql to count values on a per-column basis.
Upvotes: 3