Как получить непрочитанные сообщения, используя 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)
*"