Simply put. I need help building an FQL multi query request that will do the following:
Grab the UIDs in from the logged in user's friends list then,
Use those IDs to grab all comments and messages (from stream) from the last two weeks
Finally, join those results with there usernames
Heres the queries I have so far:
[1] GRAB_UIDs:
SELECT uid2 FROM friend WHERE uid1 = me()
[2] GRAB_STREAM (missing the 2 week part and possibly wrong altogether):
SELECT type, created_time, post_id, comments, actor_id, target_id, message
FROM stream
WHERE filter_key IN
(SELECT filter_key FROM stream_filter WHERE uid = me())
AND actor_id IN
(SELECT uid2 FROM friend WHERE uid1 = me())
)';
[3] GRAB_USRNAMES:
SELECT uid, name, username, pic_square, current_location, profile_url
FROM user WHERE uid IN
(SELECT uid2 FROM friend WHERE uid1 = me())
I could really use a master at making these kind of requests and I greatly appreciate the help.
{
"query1":"SELECT uid2 FROM friend WHERE uid1 = me()",
"query2":"SELECT type, created_time, post_id, comments, actor_id, target_id, message FROM stream WHERE filter_key IN (SELECT filter_key FROM stream_filter WHERE uid = me()) AND actor_id IN (SELECT uid2 FROM #query1)",
"query3":"SELECT uid, name, username, pic_square, current_location, profile_url FROM user WHERE uid IN (SELECT uid2 FROM #query1)"
}
You can also see the results from the Graph API Explorer at:
https://developers.facebook.com/tools/explorer?fql={%22query1%22%3A%22SELECT%20uid2%20FROM%20friend%20WHERE%20uid1%20%3D%20me%28%29%22%2C%22query2%22%3A%22SELECT%20type%2C%20created_time%2C%20post_id%2C%20comments%2C%20actor_id%2C%20target_id%2C%20message%20FROM%20stream%20WHERE%20filter_key%20IN%20%28SELECT%20filter_key%20FROM%20stream_filter%20WHERE%20uid%20%3D%20me%28%29%29%20AND%20actor_id%20IN%20%28SELECT%20uid2%20FROM%20%23query1%29%22%2C%22query3%22%3A%22SELECT%20uid%2C%20name%2C%20username%2C%20pic_square%2C%20current_location%2C%20profile_url%20FROM%20user%20WHERE%20uid%20IN%20%28SELECT%20uid2%20FROM%20%23query1%29%22}
Related
select name, birthday
from user
where uid in (SELECT uid2 FROM friend WHERE uid1 = me())
and birthday != null;
results in
{
"error": {
"message": "(#602) NULL is not a member of the user table.",
"type": "OAuthException",
"code": 602
}
}
Can I filter out the null values somehow?
No need to use str* functions... Simply use 'where field' to exclude null values, or 'where not field' to exclude non-null values. For this particular example:
select name, birthday
from user
where birthday
and uid in (SELECT uid2 FROM friend WHERE uid1 = me())
This should pull out all the nulls it works on getting common letters in the months of the year
SELECT name, birthday, email, uid FROM user WHERE uid in (SELECT uid2 FROM friend WHERE uid1 = me()) AND (strpos(lower(birthday),"a") >=0 OR strpos(lower(birthday),"e") >=0 OR strpos(lower(birthday),"u") >=0) ORDER BY birthday_date
I am trying to use FQL to get a list of my own photos that have friends tagged in them. The friends are specified by their name or part of their name. i.e input from a text box
So far I have come up with the FQL below, which almost works, but...
Can anyone tell me why the first query returns a list of records but the second query returns nothing? the only difference between the two is the second one searches on just part of the person's name i.e "laura" vs "lau"
FQL 1
SELECT object_id, src_big, src_big_width, src_big_height, aid
FROM photo
WHERE object_id in (
SELECT object_id
FROM photo_tag
WHERE subject in (
SELECT uid
FROM user
WHERE (strpos(lower(name),"laura") >=0 )
AND (uid in (SELECT uid2 FROM friend WHERE uid1 = me()) ))
)
AND owner = me()
FQL 2
SELECT object_id, src_big, src_big_width, src_big_height, aid
FROM photo
WHERE object_id in (
SELECT object_id
FROM photo_tag
WHERE subject in (
SELECT uid
FROM user
WHERE (strpos(lower(name),"lau") >=0 )
AND (uid in (SELECT uid2 FROM friend WHERE uid1 = me()) ))
)
AND owner = me()
It looks like Facebook has a bug in its system so strpos doesn't work as expected in sub queries. As a workaround you could try splitting it into two queries - one that finds list of id-s:
SELECT uid
FROM user
WHERE (strpos(lower(name),"lau") >=0 )
AND (uid in (SELECT uid2 FROM friend WHERE uid1 = me()) )
And a second one that uses this list:
SELECT object_id, src_big, src_big_width, src_big_height, aid
FROM photo
WHERE object_id in (
SELECT object_id
FROM photo_tag
WHERE subject in (111,222,333,444,555)
)
AND owner = me()
Now I get random 19 friend in my facebook with fql query : SELECT uid, pic_square, name FROM user WHERE uid IN ( SELECT uid2 FROM friend WHERE uid1 = me() ) ORDER BY rand() limit 19, But now I don't know, how to get 19 friends not in friendappuser.
I already found anwser for my question:
SELECT uid, pic_square, name
FROM user WHERE uid IN (SELECT uid2 FROM friend
WHERE uid1 = me()) AND is_app_user = 0 ORDER BY rand() limit 19
I'm using multi queries with FQL, I have 3 queries actually.
The third one is the one that interests me the most, however Facebook returns the result of the previous queries first, which means more overhead for me to process and more time to stream in the result. Is there a way to limit Facebook into only sending the result set of the 3rd query?
JSONqueries["query1"] = encodeURIComponent('SELECT uid1 FROM friend WHERE uid2 = me()');
JSONqueries["query2"] = encodeURIComponent('SELECT eid FROM event_member WHERE uid IN (SELECT uid1 FROM #query1)');
JSONqueries["query3"] = encodeURIComponent('SELECT eid, start_time, end_time, update_time, location, venue FROM event WHERE eid IN (SELECT eid FROM #query2) and privacy=\'OPEN\'');
Here you are. But it's still too complex and therefore extremely slow.
SELECT eid, start_time, end_time, update_time, location, venue FROM event WHERE eid IN(SELECT eid FROM event_member WHERE uid IN (SELECT uid1 FROM friend WHERE uid2 = me())) and privacy="OPEN"
I'm using FQL to get data from user's stream to build a web page looks like wall-to-wall. With two queries:
query = "SELECT post_id, message, created_time FROM stream WHERE filter_key IN (SELECT filter_key FROM stream_filter WHERE uid="+user['uid']+" AND type='newsfeed') AND target_id = "+uid+" AND actor_id = "+user['uid']+" LIMIT 5"
and
query = "SELECT post_id, message, created_time FROM stream WHERE filter_key IN (SELECT filter_key FROM stream_filter WHERE uid="+user['uid']+" AND type='newsfeed') AND target_id = "+user['uid']+" AND actor_id = "+uid+" LIMIT 5"
they only return:
{}
What's wrong in my queries ?
Thank you :)
try checking the values you are using for uid..
target_id means the wall it was posted to, ONLY if the wall was not the actor_id's wall..
Both will never be equal.