Conditionally sum a CCK DECIMAL field based on event start time and user ID

Last updated on
30 April 2025
$now = db_result(db_query("
SELECT event.unix_event_start FROM {event} event WHERE event.nid = $node->nid")); 
$yearstart  = mktime(0, 0, 0, 1,  1, date('Y',$now));

$sum = db_result(db_query("
SELECT 
   SUM(node_data_field_distance.field_distance_value) AS node_data_field_distance_field_distance_value
 FROM {node} node 
 LEFT JOIN {event} event ON node.nid = event.nid
 LEFT JOIN {content_type_daily_run} node_data_field_distance ON node.vid = node_data_field_distance.vid
 WHERE (node.type in ('daily_run')) AND (event.unix_event_start >= $yearstart) AND (event.unix_event_start <= $now) AND (node.uid = $node->uid)
"));

$node_field[0]['value'] = $sum;

I am tracking my daily runs, I save each run as a separate node in a CCK custom node type called "daily_run". I want to have a computed field in each node that provides a sum of the total distance run since the beginning of the year.

I also want to know the current month's total:

$now = db_result(db_query("
SELECT event.unix_event_start FROM {event} event WHERE event.nid = $node->nid")); 
$monthstart  = mktime(0, 0, 0, date('n',$now),  1, date('Y',$now));

$sum = db_result(db_query("
SELECT 
   SUM(node_data_field_distance.field_distance_value) AS node_data_field_distance_field_distance_value
 FROM {node} node 
 LEFT JOIN {event} event ON node.nid = event.nid
 LEFT JOIN {content_type_daily_run} node_data_field_distance ON node.vid = node_data_field_distance.vid
 WHERE (node.type in ('daily_run')) AND (event.unix_event_start >= $monthstart) AND (event.unix_event_start <= $now) AND (node.uid = $node->uid)
"));

$node_field[0]['value'] = $sum;

And this week's total (as I am trying to ensure I run at least 30 km / week)

$now = db_result(db_query("
SELECT event.unix_event_start FROM {event} event WHERE event.nid = $node->nid")); 
$weekstart  = mktime(0, 0, 0, date('n',$now), (date('j',$now)-date('w',$now)), date('Y',$now));

$sum = db_result(db_query("
SELECT 
   SUM(node_data_field_distance.field_distance_value) AS node_data_field_distance_field_distance_value
 FROM {node} node 
 LEFT JOIN {event} event ON node.nid = event.nid
 LEFT JOIN {content_type_daily_run} node_data_field_distance ON node.vid = node_data_field_distance.vid
 WHERE (node.type in ('daily_run')) AND (event.unix_event_start >= $weekstart) AND (event.unix_event_start <= $now) AND (node.uid = $node->uid)
"));

$node_field[0]['value'] = $sum;

Finally, I use computed fields to convert the miles calculated above to kilometers because I am a funny guy who likes to run 10km @ 7.5mph (my treadmill doesn't do metric)

$node_field[0]['value'] = round(1.609344 * $node->field_milage[0]['value'],2). 'kms';

Help improve this page

Page status: Not set

You can: