Facebook -- best way to do FQL "join" with event and event_member?

Reid Wilson picture Reid Wilson · Jun 25, 2009 · Viewed 9.7k times · Source

In a Facebook app I need to get a user's events for a date range and his rsvp status for each event.

I can get the user's events fine, but at the moment I'm looking up the rsvp status for each event one at a time, and the app is timing out for people with a large number of events.

I'm getting the user's events this way:

$fql = "SELECT eid, name, start_time, end_time 
        FROM event 
        WHERE eid IN (SELECT eid 
                      FROM event_member 
                      WHERE uid = $user) 
          AND start_time > '$timestamp' 
        ORDER BY start_time";

This part is working fine.

And here's how I'm getting the rsvp status for each event, one at a time:

$fql = "SELECT rsvp_status 
        FROM event_member 
        WHERE uid = $user
          AND eid = '$event_id'";

This also works fine on an event-by-event basis, but the app page times out when the user has many events since each event is having to get looked up each time.

With normal SQL, I could easily do this with a join, but joins aren't allowed in FQL.

One possible solution is to do them in batches by looping through each rsvp_status possibility, like this:

$fql = "SELECT eid, name, start_time, end_time 
        FROM event 
        WHERE eid IN (SELECT eid 
           FROM event_member 
           WHERE uid = $user 
           and rsvp_status = 'attending') 
        AND start_time > '$timestamp' 
        ORDER BY start_time";

This would reduce the number of FQL calls down to the number of rsvp_possibilities (three I think), but ideally I'd rather do it in one FQL call.

Answer

Nate picture Nate · Jun 27, 2009

There's not a way to do a join however you can use FQL.Multiquery to batch your 4 queries into a single call. The 4 queries would be 1 each for the 4 possible event responses: attending, unsure, declined, and not_replied.