Получить широту / долготу текущего местоположения друга, используя график FQL - PullRequest
5 голосов
/ 13 января 2012

Я пытаюсь получить широту / долготу всех друзей пользователя, используя один вызов API.Я считаю, что мне нужно написать FQL-оператор для нескольких запросов, но я не могу получить правильный синтаксис.

Я считаю, что два запроса должны быть примерно такими:

'"friends":"SELECT uid,current_location FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me())"'

'"location":"SELECT location FROM page WHERE id IN (SELECT current_location_id FROM #friends)"';

Моя проблема в том, что каким-то образом мне нужно получить идентификатор current_location в первом запросе, чтобы я мог ссылаться на него во втором запросе, но я знаю только, как получить массив, содержащий идентификатор.

Спасибо за любую помощь!

Уточнение:

Я не пытаюсь пройти регистрацию друзей.Вместо этого я хочу отобразить «current_location» (т.е. где они живут) всех друзей пользователя на географической карте.Я могу получить "current_location" пользователя с помощью следующего FQL-запроса:

"SELECT uid,sex,current_location FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me())"

Этот запрос возвращает следующий массив:

[current_location] => Array
            (
                [city] => New York
                [state] => New York
                [country] => United States
                [zip] => 
                [id] => 108424279189115
                [name] => New York, New York
            )

, который не содержит долготы и широтыcurrent_location (Нью-Йорк в приведенном выше примере)

Поэтому теперь мне нужно взять идентификатор current_location (например, 108424279189115) и выполнить второй запрос FQL, например:

"SELECT location,name FROM page WHERE page_id = 108424279189115)"

Toполучить широту и долготу current_location.В настоящее время у меня есть рабочий код, который запускает первый запрос FQL, затем извлекает page_id из php, а затем запускает второй запрос FQL, чтобы получить текущую / широту / долготу.Однако из соображений производительности я хотел бы выполнить только один мультизапрос, если это возможно.

Ответы [ 3 ]

2 голосов
/ 17 декабря 2012
fql?q=SELECT location,name FROM page WHERE page_id in (SELECT current_location.id from user where uid in(select uid2 from friend where uid1=me()))

это сделает магию для вас

2 голосов
/ 13 января 2012

Edit:

Запрос должен работать, настроив второй запрос на:

'"location":"SELECT location FROM page WHERE id IN (SELECT current_location.id FROM #friends)"';

При работе с типом массива в FB API вы можете получить доступ к значению в любом запросе, выполнив array.value

Кроме того, если все, что вам нужно, это идентификатор страницы, вы, вероятно, получите более высокую производительность, выполнив current_location.id в своем первом запросе


Вы захотите использовать fql.multiquery, здесь есть похожий ответ, который можно адаптировать к вашим потребностям: Facebook Graph API получает всех пользователей и их статус

Документация по FQL для мультизапроса находится здесь: http://developers.facebook.com/docs/reference/fql/

Также вы пытаетесь получить лат / лонг объекта регистрации? Если это так, вам нужно взглянуть на этот ресурс: http://developers.facebook.com/docs/reference/fql/checkin/

Edit:

Я не уверен, что то, что вы пытаетесь сделать, возможно. Я только что просмотрел API и протестировал некоторые запросы. Единственный способ получить лат / лонг у друга, кажется, основан на регистрации, оттуда вы можете получить подробную информацию на странице, если это необходимо ... Даже глядя на ваш Во втором запросе current_location_id не упоминается нигде в таблице страниц, и выбор местоположения из таблицы страниц даст вам информацию о местоположении того места, к которому он относится. Может быть, вы могли бы подробнее рассказать о том, что вы пытаетесь достичь.

Вот заявление с несколькими запросами, которое я написал на PHP с использованием FQL (оно выберет координаты всех проверок ваших друзей, а затем оттуда получит подробную информацию о месте регистрации, относящейся к этому другу):

try{
    $multiQuery = "{
        'query1':'SELECT coords, tagged_uids, page_id FROM checkin WHERE author_uid IN (SELECT uid2 FROM friend WHERE uid1 = me())',
        'query2':'SELECT name, description FROM page WHERE page_id IN (SELECT page_id FROM #query1)'
    }";

    $param = array(       
         'method' => 'fql.multiquery',       
         'queries' => $multiQuery,       
         'callback' => ''
    );       
    $queryresults = $facebook->api($param);
        print_r($queryresults);
    }
catch(Exception $o){
    print_r($o);
}
1 голос
/ 04 августа 2013
facebook.batch_fql({
    'query1': "SELECT uid, name, current_location.id FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=me())",
    'query2': "SELECT page_id, name, description, location FROM page WHERE page_id IN (SELECT current_location.id FROM #query1)"
})

вернет два ответа

один будет список друзей UID, имена и идентификаторы их текущего местоположения

другой будет список уникальных идентификаторов местоположения с их именем, описанием и информацией о геолокации

РЕДАКТИРОВАТЬ : если вы запросите current_location с помощью FQL, вы получите полный латлонг в первом ответе и вам даже не понадобится второй

...