DazzaDanger
DazzaDanger

Reputation: 3

PHP - Grouping matching variables and calculate averages

I hope you are all well.

I am currently teaching myself PHP and as part of this I have been attempting to develop a feedback system that stores the info off customer feedback cards for the restaurant where I work.

The problem that I have revolves around the php code that I am using to generate the json output that is then used by jqplot to create a graph.

Here is the code I am using to do this:

<?php

// $toDate and $fromDate will eventually be values coming over via post however i am using static values at the moment for testing

$toDate = time();
$fromDate = time() - (7 * 24 * 60 * 60);

$sql = "SELECT * FROM feedback WHERE visitDateTime BETWEEN FROM_UNIXTIME($fromDate) AND FROM_UNIXTIME($toDate)";

$result = mysql_query($sql) or die(mysql_error());
?>

After getting the data I then use this code in javascript and php to generate the jqplot data.

<script>
$(document).ready(function(){
 var line1 = [
<?php
while ($row = mysql_fetch_assoc($result)){
echo '[';
echo "'";
echo $row['visitDateTime'];
echo "',";
echo $row ['foodScore'];
echo ']';
echo ',';
}

?>

];

// code then goes on to generate the chart, etc....

</script>

This works fine and generates the following json output:

 var line1 = [
['2012-04-20 19:00:00',7],['2012-04-20 19:00:00',8],['2012-04-20 12:00:00',8],['2012-04-22 16:00:00',5],['2012-04-21 20:00:00',9],  

];

However, the problem that i have is that when 2 dates and times are the same, which they probably would be, then this causes problems on the chart because i have multiple values for 1 date.

After giving it some thought i came to the conclusion that what i need to actually be doing is calculating the average score for the dates and times so that it generates output like shown below:

var line1 = ['unique date/time', average of all scores from this date/time ]

But i have no idea how to even begin to do that.

I know this is probably wrong but im thinking that i need to loop through all the retrieved records and check to see if the date/time is the same. So basically, instead of returning this:

['2012-04-20 19:00:00',7],['2012-04-20 19:00:00',8],['2012-04-20 12:00:00',8],['2012-04-20 12:00:00',5],['2012-04-20 12:00:00',9]

I need to return this:

['2012-04-20 19:00:00',7.5],['2012-04-20 12:00:00',7.3]

If anyone could offer me any pointers on how to go about this it would really help me out.

Thanks everyone.

Upvotes: 0

Views: 112

Answers (1)

Falle1234
Falle1234

Reputation: 5063

Instead of doing the averaging calculations on the server, you could let MySQL do it for you. You could use a query like this to retrieve the data grouped and averaged directly from MySQL

SELECT avg(foodScore), visitDateTime FROM feedback WHERE visitDateTime BETWEEN FROM_UNIXTIME($fromDate) AND FROM_UNIXTIME($toDate) group by visitDateTime

Let me know if this doesn't work

Upvotes: 2

Related Questions