Ответ 1
Невозможно сделать соединение, но вы можете использовать FQL.Multiquery, чтобы пакетные 4 запроса были отправлены в один вызов. Эти 4 запроса будут равны 1 для 4 возможных ответа на события: участие, неуверенность, отклонение и not_replied.
В приложении Facebook мне нужно получить пользовательские события для диапазона дат и его статуса rsvp для каждого события.
Я могу получить пользовательские события в порядке, но на данный момент я просматриваю статус rsvp для каждого события по одному, а приложение выбирает время для людей с большим количеством событий.
Я получаю пользовательские события таким образом:
$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";
Эта часть работает нормально.
И вот как я получаю статус rsvp для каждого события, по одному за раз:
$fql = "SELECT rsvp_status
FROM event_member
WHERE uid = $user
AND eid = '$event_id'";
Это также отлично работает на основе событий за каждым событием, но при этом страница приложения не работает, когда у пользователя много событий, так как каждое событие должно каждый раз проверяться.
С обычным SQL я мог бы легко сделать это с помощью соединения, но объединения не разрешены в FQL.
Одно из возможных решений заключается в том, чтобы делать их в партиях, перебирая каждую возможность rsvp_status, например:
$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";
Это уменьшит количество вызовов FQL до числа rsvp_possibilities (три, я думаю), но в идеале я предпочел бы сделать это одним вызовом FQL.
Невозможно сделать соединение, но вы можете использовать FQL.Multiquery, чтобы пакетные 4 запроса были отправлены в один вызов. Эти 4 запроса будут равны 1 для 4 возможных ответа на события: участие, неуверенность, отклонение и not_replied.