Как получить непрочитанные сообщения, используя FQL?

Я пытаюсь получить тело и отправителя всех непрочитанных почтовых ящиков.

Чтобы получить все цепочки сообщений с непрочитанными сообщениями, я использовал этот запрос:

SELECT thread_id from unified_thread WHERE folder='inbox' AND unread=1

чтобы получить непрочитанное сообщение потока я использовал этот запрос

SELECT sender,body FROM unified_message WHERE unread=1

Я пробовал следующий вложенный запрос:

SELECT sender,body FROM unified_message WHERE thread_id IN (SELECT thread_id FROM unified_thread  WHERE folder = 'inbox' AND unread=1) AND unread=1"

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

Я также попробовал несколько запросов, как это:

String query1="SELECT thread_id FROM unified_thread WHERE folder='inbox' AND unread=1";
String query2="SELECT timestamp,sender,body FROM unified_message WHERE unread=1 AND thread_id IN (SELECT thread_id FROM #query1)";
Bundle params = new Bundle();
JSONObject jsonFQL=new JSONObject();
try {
        jsonFQL.put("query1",query1);
        jsonFQL.put("query2",query2);
} catch (JSONException e) {
        e.printStackTrace();
}

params.putString("method","fql.multiquery");
params.putString("queries", jsonFQL.toString());
new Request(session,"/fql",params,HttpMethod.GET,new Request.Callback(){
      public void onCompleted(Response response) {
                                     ...
                                 }
                     ).executeAsync(); ....

но я получил ошибку:

errorMessage: неподдерживаемый метод, fql.multiquery

Затем я попробовал с INNER JOIN:

SELECT unified_message.sender,unified_message.body 
            FROM unified_message 
            INNER JOIN unified_thread 
            ON unified_message.thread_id=unified_thread.thread_id
            WHERE unified_thread.unread=1

но я получил эту ошибку:

Ошибка парсера: неожиданное "INNER" в позиции...

Я узнал, что JOIN не поддерживается в FQL

Может кто-нибудь помочь мне сделать этот запрос на FQL?

пример необходимого вывода: у меня 5 разговоров с разными людьми, но только 3 разговора имеют непрочитанные сообщения. Поэтому я хотел бы получить что-то вроде этого:

UNREAD MESSAGES

Sender: Anna 
Body: hello dude 
Body: how are you? 
Body: I miss you

Sender: John
Body: please help me 

Sender: Erick 
Body: nice
Body: buddy

4 ответа

Решение

Это работает:

  SELECT sender, body FROM unified_message 
   WHERE thread_id IN 
         (SELECT thread_id FROM unified_thread WHERE folder = 'inbox' AND unread=1) 
     AND unread=1 
ORDER BY timestamp DESC

Важно отсортировать полученные сообщения в порядке убывания, используя:

ORDER BY timestamp DESC

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


Насколько вам известно, вот соответствующий мультизапрос, который дает тот же результат:

{
 "threads":"SELECT thread_id FROM unified_thread WHERE folder='inbox' AND unread=1",
 "messages":"SELECT sender, body FROM unified_message WHERE thread_id IN (SELECT thread_id FROM #threads) AND unread=1 ORDER BY timestamp DESC"
}

Однако вы не должны больше использовать FQL:

Версия 2.0 API платформы Facebook является последней версией, в которой будет доступен FQL. Версии после 2.0 не будут поддерживать FQL. Пожалуйста, перенесите ваши приложения, чтобы использовать Graph API вместо FQL. Пожалуйста, смотрите наш список изменений для текущей информации о версии.

Я предлагаю вам использовать следующие таблицы API API:

  • thread
  • message

Кстати, у FQL такого нет INNER JOIN,

Этот вложенный запрос вы разместили

SELECT sender,body FROM unified_message WHERE thread_id IN (SELECT thread_id FROM unified_thread WHERE folder = 'inbox' AND unread=1) AND unread=1

должно сработать. Если это не так, рассмотрите возможность регистрации ошибки.

Ломая его,

ВЫБЕРИТЕ thread_id ОТ unified_thread WHERE папка = 'Входящие' И непрочитанные =1

Должен дать вам идентификаторы потоков для потоков с непрочитанными сообщениями. Единственный улов здесь заключается в том, что unified_thread не обязательно возвращает все темы, даже с LIMITприменяется. То, что вы сделали здесь, было хорошо (пока набор непрочитанных ответов достаточно мал)

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

Большой запрос

SELECT sender,body FROM unified_message WHERE thread_id IN (SELECT thread_id FROM unified_thread WHERE folder = 'inbox' AND unread=1) AND unread=1

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

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

Так что с этим запросом

SELECT thread_id, participants, link FROM unified_thread WHERE folder = 'inbox' AND unread

Перепроверьте, совпадают ли участники и ссылки с тем, что есть в вашей папке входящих.

Я не совсем уверен, если это решит вашу проблему, но кажется, что параметр "q", а не "запросы":

params.putString("q", jsonFQL.toString());

... если вы посмотрите на документы Facebook:

https://developers.facebook.com/docs/technical-guides/fql

Вполне возможно, что они недавно изменили его, хотя это устарело, поэтому я не думаю, что они приложат немало усилий.

Multi-запрос:

Оценивает серию запросов FQL (Facebook Query Language) за один вызов и возвращает данные за один раз.

Этот метод использует словарь в кодировке JSON, называемый "запросы", где отдельные запросы используют точно такой же синтаксис, что и простой запрос. Однако этот метод позволяет выполнять более сложные запросы. Вы можете получить данные из одного запроса и использовать их в другом запросе в рамках того же вызова. Предложение WHERE является необязательным в последнем запросе, поскольку оно ссылается на данные, которые уже были получены. Чтобы сослаться на результаты одного запроса в другом запросе в рамках того же вызова, укажите его имя в предложении FROM, которому предшествует #.

Например, скажем, вы хотите получить некоторые данные о пользователе, посещающем событие. Обычно вам нужно выполнить два запроса подряд, ожидая результатов первого запроса, прежде чем выполнять второй запрос, так как второй запрос зависит от данных первого. Но с помощью fql.multiquery вы можете запускать их одновременно и получать все нужные вам результаты, обеспечивая лучшую производительность, чем выполнение серии вызовов fql.query. Во-первых, вам нужно получить ID пользователя и статус RSVP каждого участника, чтобы вы сформулировали первый запрос - query1 - следующим образом:

*

"query1": "ВЫБЕРИТЕ uid, rsvp_status ОТ Event_member WHERE eid = 12345678"

*

Затем, чтобы получить данные профиля каждого участника (имя, URL и изображение в данном случае), вы должны сделать второй запрос - query2 - который ссылается на результаты запроса query1. Вы формулируете query2 так:

"*

query2 ":" ВЫБЕРИТЕ имя, URL, рис. ИЗ профиля, ГДЕ ИДЕНТИФИКАЦИЯ (ВЫБЕРИТЕ uid ИЗ # запроса1)

*"

https://developers.facebook.com/docs/technical-guides/fql

Другие вопросы по тегам