2013-12-05 2 views
2

FQL - это сложно. Убедившись, что он возвращает все возможные результаты, это одно из самых загадочных упражнений, о которых я могу думать. Учитывайте эти запросы, которые отличаются только лимитом и смещением, и их возвращенные результаты:FQL: отклонение от границы и смещения возвращают неожиданные результаты

SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me()) 
    AND 0 < created AND created < 1299952078 LIMIT 400 OFFSET 0 

Результаты 400 результатов. ОК, круто.

SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me()) 
    AND 0 < created AND created < 1299952078 LIMIT 400 OFFSET 400 

Результаты поиска 0. Хм, может быть, у меня всего ровно 400 фотографий. Давайте просто подтвердим, что:

SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me()) 
    AND 0 < created AND created < 1299952078 LIMIT 500 OFFSET 0 

Результаты возвратов 357. Wat. Где остальные 43 результата? Позвольте мне опустить лимит и страницу через:

SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me()) 
    AND 0 < created AND created < 1299952078 LIMIT 300 OFFSET 300 

Результаты поиска 0 results ??? Да ладно.

Может ли кто-нибудь объяснить это? Я вытаскиваю волосы.

+0

Думаю, я вижу некоторые проблемы. FQL и YQL являются вариантами SQL и, как правило, имеют одинаковый синтаксис. В ваших образцах вам не нужно 0 <создано, поскольку оно никогда не должно быть меньше 0. Создано ли поле идентификатора или дата? потому что это изменит ситуацию. Также LIMIT должно быть компенсировано, предел как в: 'LIMIT 0, 400 (это может быть упрощено до LIMIT 400) LIMIT 400, 400 LIMIT 0, 500 (или LIMIT 500) LIMIT 300,300' Кроме того, если вы действительно хотите упростить запрос, создайте BETWEEN 0 AND 1299952078', но как указано, созданный <1299952078 должен работать. – Shawn

+0

вы также можете проверить, что контент не изменяется (никаких ошибок между запросами не было)? Наверное, это не вопрос, требующий дополнительной информации. – Shawn

+0

Спасибо @shawn, я не знал об этом синтаксисе ограничений. Однако, используя ваши предложения, результаты точно такие же, как и раньше. –

ответ

4

Комментируя дальше @ USER15 источник: https://developers.facebook.com/blog/post/478/

enter image description here

Объяснение:

В частности применены к примеру:

SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me()) 
AND 0 < created AND created < 1299952078 LIMIT 400 OFFSET 0 
Returns 400 results. Okay, cool. 

Это означает, что в некоторых разрозненных данных (№ 3 на картинке), вы смогли получить 400 итоговых результатов LTS.

SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me()) 
    AND 0 < created AND created < 1299952078 LIMIT 400 OFFSET 400 
Returns 0 results 

Это происходит прямо из текста:

Это также означает, что, когда вы вручную строить свои собственные запросы, вы должны знать, что с некоторыми таблицами и подключениями, если вы указав « смещение ", N-й результат, который вы указываете на , не может быть возвращен в ваших результатах (например, 3-й результат на шаге 2 выше).

Одна сложная проблема заключается в определении того, достигли ли вы конца набора результатов . Например, если вы указали ограничение на «5», но возвращенные сообщения с пятью не будут видны зрителю, вы получите пустой набор результатов .

Таким образом, похоже, что с лимитом вы получите # 3 на графике, но при использовании его смещения вы получите что-то вроде # 2; что означает, что ваше смещение может помещать вас в одну из красных областей # 2, то есть сообщение невидимо для пользователя и не будет в вашем наборе данных (0 возвращенных результатов).

SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me()) 
    AND 0 < created AND created < 1299952078 LIMIT 500 OFFSET 0 
Returns 357 results 

Из их текста:

Параметры запроса применяются на нашем конце перед тем проверки, чтобы увидеть, если возвращаемые результаты видны зрителю. Из-за этого возможно получить , чтобы получить меньше результатов, чем ожидалось.

SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me()) 
    AND 0 < created AND created < 1299952078 LIMIT 300 OFFSET 300 
Returns 0 results 

Смотрите мой ответ на ваш второй запрос

Решение:

В соответствии с моим комментарием на ваш вопрос о том, как упростить исходный запрос:

SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me()) 
    AND created < 1299952078 LIMIT 400; 

Этот запрос говорит о проверке всех фотографий во всех моих альбомах, где созданный дата до некоторого времени (временная метка). Это верно?

два возможных решения я мог видеть, что Вы делаете:

  1. Проверьте, чтобы увидеть, что разрешение ограничения есть на тех фотографиях , которые становятся удалены из результирующего набора, вам может понадобиться переделки ваш запрос включают в себя следующие:

    От: https://developers.facebook.com/docs/reference/fql/photo

    Разрешения

    Чтобы прочитать таблицу фотографий вам нужно

    • любой действительный access_token, если она является публичной и принадлежит странице.
    • Права пользователя user_photos для доступа к фотографиям и альбомам, загруженным пользователем, и фотографии, на которых был помечен пользователь.
    • Права доступа friends_photos для доступа к фотографиям и фотографиям друзей, в которых были помечены друзья пользователя.
  2. Это один я думаю, что будет работать лучше для вас.Вы, возможно, потребуется выбрать достаточно низкий предел, как 20 или 50, а также настроить метку вокруг вашего запроса, такие как:

    Предыдущая:

    SELECT, заголовок FROM фото WHERE помощи IN (ВЫБРАТЬ помощь из альбома ГДЕ владелец = me()) И создал < 1299952078 LIMIT 20;

    Следующая:

    ВЫБРАТЬ подпись С фото КУДА помощи IN (SELECT помощь из альбома ГДЕ владелец = я()) И создал < 1298123456 LIMIT 20;

Позвольте мне знать, если любой из этих работ для вас. Обратите внимание, что я составил вторую временную метку, вам придется это понять.

+0

Спасибо за подробный ответ. Это на самом деле то, как я попал в эту ситуацию в первую очередь. Моя конечная цель - получить все фотографии для пользователя. Пользователь, которого я запрашиваю, имеет более 5000 фотографий, поэтому любой запрос к FQL будет ограничен этим числом, несмотря ни на что. Фактически я начал с 'created <1386367906' (до сих пор), и до тех пор, пока мое смещение меньше 5000, каждая страница всегда * точно указывает личную сумму.Запросы в моем вопросе основаны на принятии минимального созданного поля и начале, согласно вашему предложению. –

+0

Другой способ пойти, может быть, вместо этого использовать графики api? Похоже, он знает внутренне, как обращаться с предыдущими и последующими вызовами, основываясь на лимите, которая вам нужна. Возможно ли это для вас? – Shawn

1

Запрос FQL возвращает только результаты, которые видны вам, с разрешениями, которые вы задали. Таким образом, можно получить меньше результатов, чем указанный вами LIMIT.

Если вы используете

... LIMIT 400 OFFSET 0 

вы получите первые 400 результатов между индексом 0 и 400. Но если вы используете

... LIMIT 400 OFFSET 400 

вы просите результатов от 0 до 400, со смещением 400, которая всегда будет возвращать 0 результатов. Если вы хотите получить следующие 400 результатов, вы должны использовать

... LIMIT 400,800 
Смежные вопросы