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:
You can:
- Log in, click Edit, and edit this page
- Log in, click Discuss, update the Page status value, and suggest an improvement
- Log in and create a Documentation issue with your suggestion