简体   繁体   中英

Total number of yes and no values from mysql database table row

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 在此输入图像描述

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.

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)

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.

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 |

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM