When to add an extra "helper" table rather than running complex query
As long as all your fields used in JOIN and WHERE are indexed properly, you don't really need a separate table to do this, I probably would rewrite it in a single query, sub queries tend to be slow.

If you want something intermediate (in case you have > 1.000.000 rows), you have 2 options:


Create a temporary table and keep it up to date using cron and/or
hooks 
Use caching in Drupal to remember the result and combine it
with hooks


Both solution have pro's and con's:


Can be updated by cron, but has a record for every user, no matter if that user visits the site or not.
Needs to run the query when there's no cached data, but will be faster on a second page visit.