2009-06-25 7 views
14

Dans une application Facebook, je dois obtenir les événements d'un utilisateur pour une plage de dates et son statut rsvp pour chaque événement.Facebook - meilleure façon de faire FQL "se joindre" à event et membre_membre?

Je peux obtenir les événements de l'utilisateur bien, mais pour l'instant, je recherche le statut rsvp pour chaque événement un à la fois, et l'application arrive à expiration pour les personnes ayant un grand nombre d'événements.

Je reçois des événements de l'utilisateur ainsi:

$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"; 

Cette partie fonctionne bien.

Et voici comment j'obtenir le statut de rsvp pour chaque événement, un à la fois:

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

Cela fonctionne aussi bien sur une base événement par événement, mais les temps de page de l'application lorsque l'utilisateur a beaucoup d'événements puisque chaque événement doit être recherché à chaque fois. Avec un SQL normal, je pourrais facilement le faire avec une jointure, mais les jointures ne sont pas autorisées dans FQL.

Une solution possible est de les faire en lots en boucle à travers chaque possibilité de rsvp_status, comme ceci:

$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"; 

Cela réduirait le nombre de FQL appelle au nombre de rsvp_possibilities (trois je pense), mais idéalement, je préfère le faire dans un appel FQL.

Répondre

7

Il n'existe aucun moyen d'effectuer une jointure, mais vous pouvez utiliser FQL.Multiquery pour regrouper vos 4 requêtes en un seul appel. Les 4 requêtes seraient 1 chacune pour le 4 possible event responses: participant, incertain, refusé, et non recopié.

Questions connexes