I need to total up values stored in upto 17 columns in the same table using php, and trying to keep the query as small and simple as possible:
table is Setup like so:
| siterun1 | siterun2 | siterun3 | siterun4 | siterun5 | siterun6 | siterun17 |
| 0 | 5 | 4 | 1 | 0 | 0 | 3 |
is there a quick way of writing a query that counts up all the values from column siterun1 all the way upto siterun17 ?
at the moment i started to write out;
SELECT SUM(siterun1) as 'siterun1', SUM(siterun2) as 'siterun2',
SUM(siterun3) as 'siterun3',
(SUM(siterun1) + SUM(siterun2) + SUM(siterun3)) as 'Total'
FROM dataTable WHERE sessionID=1
but this is going to get very big upto 17 columns with the possibility of more at a later date.
basically i need it to add up the columns and echo the result.
any help on this would be great, my above code will work but i'm not sure if its the best approach.
For the total you can use a single SUM
, so instead of
(SUM(siterun1) + SUM(siterun2) ...) Total
you can write
SUM(siterun1 + siterun2 ...) Total
or as mentioned in the comments you can use php (array_sum
) to do the summing.
$query = "SELECT SUM(siterun1) as 'siterun1',
SUM(siterun2) as 'siterun2',
SUM(siterun3) as 'siterun3'
FROM dataTable WHERE sessionID=1";
$rs = mysqli_query($query);
$r = mysqli_fetch_assoc($rs);
$r['Total'] = array_sum($r); //assumes you only have sum columns in your select
You can make a function that generates sql based on array of siterun columns
function genSiterunSql($siteruns,$sessId){
$sql = array();
$tsum = array();
foreach ($siteruns as $siterun){
$sql[] = "SUM (siterun{$siterun}) as 'siterun{$siterun}' ";
$tsum[] = "SUM (siterun{$siterun})";
}
return 'SELECT '. implode(' , ', $sql) . ' , ( '. implode(' + ', $tsum ) .') as Total FROM dataTable WHERE sessionID=' . $sessId;
}
$siteruns=array(1,2,3,4,5,17);
echo genSiterunSql($siteruns, 22);
// SELECT SUM (siterun1) as 'siterun1' , SUM (siterun2) as 'siterun2' , SUM (siterun3) as 'siterun3' , SUM (siterun4) as 'siterun4' , SUM (siterun5) as 'siterun5' , SUM (siterun17) as 'siterun17' , ( SUM (siterun1) + SUM (siterun2) + SUM (siterun3) + SUM (siterun4) + SUM (siterun5) + SUM (siterun17)) as Total FROM dataTable WHERE sessionID=22