Ok after tireless research and consulting a mentally unstable but masterful sql specialist friend of mine, I have two approaches.
APPROACH 1
the unstable guy said do this. it's simple and seems to work:
SELECT COUNT(DISTINCT eta.id)
FROM demo_event_time_assoc eta,
demo_events e,
demo_event_subcategory_assoc esa,
demo_zip_codes z
WHERE eta.event_id=e.id
AND esa.event_id=e.id
AND z.zip=e.zip
AND e.active=1
AND esa.subcategory_id IN (1,2,3,4,5,6,7,8,9,10)
AND (
(eta.start_timestamp >= 1162281600 AND eta.start_timestamp <= 1162368000)
OR
(eta.end_timestamp < 1162281600 AND eta.end_timestamp > 1162285200))
AND (3963.20477315*(2*asin(sqrt(POWER(sin((0.595334589 56 -z.lat_radians)/2),2) + cos(0.59533458956)*cos(z.lat_radians)*POWER(sin((-2.06592416764 - z.long_radians)/2),2)))) < 50)
So I can live with that -- unless anybody sees how it might bring back the wrong result. It looks pretty good to me though.
APPROACH 2
This is only available in MySQL 4.0.0 or higher but looks pretty rad. I'm wondering if it's reliable? faster? a bad idea? It seems too good to be true. Is there any way to determine your MySQL version to know if this would be ok?
Run the original query but add 'SQL_CALC_FOUND_ROWS' before the selected fields. Go ahead and include your LIMIT clause because you are paging.
SELECT SQL_CALC_FOUND_ROWS e.id, e.title, e.subheading, eta.start_timestamp, eta.end_timestamp, e.zip, e.bold, e.outline, e.color, e.subheading, COUNT(esa.id) AS subcat_count
FROM demo_event_time_assoc eta,
demo_events e,
demo_event_subcategory_assoc esa,
demo_zip_codes z
WHERE eta.event_id=e.id
AND esa.event_id=e.id
AND z.zip=e.zip
AND e.active=1
AND esa.subcategory_id IN (1,2,3,4,5,6,7,8,9,10)
AND (
(eta.start_timestamp >= 1162281600 AND eta.start_timestamp <= 1162368000)
OR
(eta.end_timestamp < 1162281600 AND eta.end_timestamp > 1162285200))
AND (3963.20477315*(2*asin(sqrt(POWER(sin((0.59533458956 -z.lat_radians)/2),2) + cos(0.59533458956)*cos(z.lat_radians)*POWER(sin((-2.06592416764 - z.long_radians)/2),2)))) < 50)
GROUP BY eta.id
ORDER BY subcat_count DESC, eta.id
LIMIT 0, 50
Then run this query...it will return the total number of rows that met your criteria, ignoring the LIMIT clause:
SELECT FOUND_ROWS() AS total_records