FQL query limit - facebook

I was trying this simple query on the Graph Explorer
SELECT eid FROM event_member
WHERE (uid IN (SELECT uid2 FROM friend WHERE uid1 = me())
OR uid = me())
and it returns "error: Request Failed."
Then, I started reading here and some forums and it had to do with the limits, so I've tried limiting by 20 my friend list and it worked.
Which is the limit? and where (the query, or the results given)? There's nothing in the documentation as far as I know.
EDIT:
What if I order my whole friends by mutual_friend_count and then limit by 200? I also added start_time>now(). It's not the best way to find the closest friends, but it doesn't need permissions to access your stream (to check likes and comments from friends).
SELECT eid FROM event_member
WHERE (uid = me()
OR uid IN (SELECT uid FROM user
WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me()
ORDER BY mutual_friend_count DESC)
LIMIT 200)
)
AND start_time > now()
Is it too many queries inside another one? They are three actually.
It isn't efficent
in some cases. For example, in my case, the top mutual friends lives
in my hometown, and I'm interested in events from my actual city.
Imagine I limit the events retrieved by only 5 per user. It shouldn't be so hard ONLY IF the user had a list of upcoming events he/she is attending/unsure.
For example, doing graph.facebook.com/user-id/events "seems" to work like that.
However, I guess reading from event_member table it's not so easy because it would traversing a large database of events and checking one by one if any friend of mine is in there. Am I wrong?

The limits are as far as I know (and you wrote it as well) not documented. I'd recommend that you use the
LIMIT start, end
in your subquery as follows
SELECT eid FROM event_member
WHERE (uid IN (SELECT uid2 FROM friend WHERE uid1 = me() LIMIT 0,24)
OR uid = me())
A best practice that I use is to get the number or friends in advance, and then create "breakdown queries", i.e. you've got 187 friends and the desired limit is 25 per query, then you'll need to 8 "breakdown queries" to get the whole event list from your friends. This can also be done via a batch request (but friends need to be counted first in a separate query).
The general limit of these calls on Facebook's side are either the processing time or the length of the result I guess...

Related

Facebook FQL Get All Posts At Location

The location_post FQL table is described as the following:
An FQL table that returns Posts that have locations associated with
them and that satisfy at least one of the following conditions:
you were tagged in the Post
a friend was tagged in the Post
you authored the Post
a friend authored the Post
So I wrote the following FQL script with the intent of getting all posts my friends and I had made at a certain location:
SELECT id, message, post_id, timestamp FROM location_post WHERE page_id=303736809701751
However, an empty data set is returned. In this particular case, I expect some of my own posts to be returned, though I have tried other place ids that should have returned friends' posts as well.
What is missing from the request, or is this a bug I should report to Facebook?
The paragraph you quoted from the doc just says that the table only contains places where yourself and friends of yours have been. It tries to explain that you will not find public users there.
A query to the location_post table does not automatically specify the concerned IDs for you. If you want to search for the places where all your friends have been, you will have to indicate all your friends. If you are only interested by a bunch of friends, just add the concerned IDs.
This should do it.
SELECT id, message, post_id, timestamp
FROM location_post
WHERE (author_uid IN (SELECT uid2 FROM friend WHERE uid1 = me())
OR author_uid = me()
OR tagged_uids IN (SELECT uid2 FROM friend WHERE uid1 = me())
OR tagged_uids = me())
AND page_id = 303736809701751

FQL Get all of my friends' checkins?

This seems to be impossible as of now .. can anyone give me a suitable query or a set of queries that can do this? Basically, I need ALL my friends' checkins: Ones they've checked in by themselves, Ones in which they've checked with a picture, Ones in which a user who is not my friend tagged them in.
My first attempt was this:
SELECT checkin_id, author_uid, page_id, coords, tagged_uids, timestamp FROM checkin WHERE (author_uid IN (SELECT uid2 FROM friend WHERE uid1 = me()) OR author_uid=me()) ORDER BY timestamp DESC LIMIT 50
But this doesn't include checkins with pictures.
My second attempt was this:
SELECT id, author_uid, app_id, timestamp, tagged_uids, page_id, page_type, coords, type FROM location_post
WHERE author_uid IN (SELECT uid2 FROM friend WHERE uid1=me())
But like the WHERE clause suggests, we're only looking for checkins which were created by a friend, but not ones in which my friends are tagged.
My next attempt was this:
SELECT id, author_uid, app_id, timestamp, tagged_uids, page_id, page_type, coords, type FROM location_post
WHERE tagged_uids IN (SELECT uid2 FROM friend WHERE uid1=me())
But it just returns an empty data set as it probably should.
So short of submitting 500 odd queries, one for each of my friends, is there a way to do this?
Any pointers are much appreciated!
Thanks,
Teja
we can also use following FQL to get friends checkins and checkins in which friends are tagged:
SELECT checkin_id FROM checkin WHERE author_uid IN (SELECT uid2 FROM friend WHERE uid1 = me()) OR tagged_uids IN (SELECT uid2 FROM friend WHERE uid1 = me())
Does this need to be in FQL or would the Graph API not suffice for this?
/me/friends?fields=checkins, although very slow (warning: with lots of friends this could timeout completely), returns me a list of my friends with an array of their recent checkins (and those checkins' likes, comments, etc)
You could also break it up into batches of friends for better performance:
/?fields=checkins&ids=[CSV LIST OF FRIENDS TO CHECK]
I was recently trying to solve the same problem and finding that using the graph via /me/friends?fields=checkins was too slow to be usable and sometimes times out completely.
I did just stumble across the search function though, which seems to do exactly what I (and perhaps you) want.
To quote the facebook documentation:
Checkins: https://graph.facebook.com/search?type=checkin (This request
returns you or your friend's latest checkins, or checkins where you or
your friends have been tagged; currently, it does not accept a q=
parameter.)
There's tons more examples here under Search: https://developers.facebook.com/docs/reference/api/

What's the query to get a list of a user's own posts that they have Liked?

Yes, I know that it's unusual for a user to "like" their own posts but that's what I'm looking for. I also know that you can't query the like table by user to get everything they've liked but that's not what I'm after. I just want their own posts (and later, photos) that they've liked.
I've clearly gotten pathetically rusty in my SQL skills--playing around with statements based off of the examples I've found:
SELECT source_id,message,created_time FROM stream WHERE source_id=me()
and
SELECT actor_id, post_id, message FROM stream WHERE uid IN (SELECT uid2 FROM like WHERE uid1=me())
I imagine what I want is either trivial to do or currently impossible. I expect the former.
To get the post ids that the user likes, it would be something like:
SELECT post_id
FROM like
WHERE object_id in (SELECT source_id FROM stream WHERE source_id=me())
AND user_id = me()
You could expand this to also include photo ids. And you could nest it another level deep to get more post info by using the like's post_id field.

Does Facebook friends sequence remains same while using FQL?

I am using FQL to get the list of friends
$fql = select uid, name, work_history,
education_history, current_location
from user where uid IN (select uid2
from friend where
uid1=FACEBOOK_USER_ID);
does this query returns same friend sequence all the time or it is different in few cases.
suppose list returns : Friend1,friend2,friend3 .... etc
So does it return the same sequence all the time or not?
Please let me know if any further detail required or if the problem is not clear.
-deepak
I'd take all doubt out of the equation and just add an ORDER BY:
SELECT uid, name, work_history, education_history, current_location
FROM user
WHERE uid IN (select uid2 from friend where uid1=<FACEBOOK_USER_ID>)
ORDER BY uid
It appears that they come back in sequential order based on the user id. So if you had three friends with the user ids 111111, 222222, and 3333333, they would be returned in that order.
With THAT said, I wouldn't rely on this behavior. Even if it never changes, it is probably bad practice to assume it will always be that way. It's a much better practice to get the data, then order it on your end to your needs. That way you know it is always in the order you want even if the ordering on Facebook's end changes.

Facebook current UID with FQL

How can i get my current UID with FQL.. i want to save traffic and requests with getting the the friends of a user with fql.multiquery
"query1": GET NEED MY USERID
"query2":"SELECT uid, first_name, last_name FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=MYUSERID) order by first_name"
should return my friends! getting users with friends.get and then users.getInfo needs 2 requests and is not optimal...
Thank you
Your first query should be entirely unnecessary, as Facebook always provides the uid to an application via the fb_sig_user parameter (POST or GET). I'm not sure what kind of FQL query you could use to get a uid based on some other form of information. There's no sessions table or anything available to FQL (available tables are listed here).
For multi-queries however, I'm fairly certain that this page describes exactly what you need to do, but I'll throw some code together in the way that I would do it.
If it was a PHP app, and I wanted to do this server side, I would create a couple of JSON-formatted strings and send them as a query as follows:
$fql= '{
"userinfo":"SELECT uid FROM user_standard_info WHERE first_name=\'zombat\'",
"friends":"SELECT uid2 FROM friend WHERE uid1 IN (SELECT uid FROM #userinfo)}"
}';
$res = $facebook->api_client->fql_multiquery($fql);
print_r($res['userinfo']);
print_r($res['friends']);
This should produce a dump of your query results.
Assuming you have your current uid available from the fb_sig_user parameter (which you should), then your problem should be solved by something like this:
$fql= '{
"friends":"SELECT uid2 FROM friend WHERE uid1='.$your_uid.',"
"friendinfo":"SELECT * FROM standard_user_info WHERE uid IN (SELECT uid2 FROM #friends)"
}';
$res = $facebook->api_client->fql_multiquery($fql);
Note: You may want to have a careful look at some of the queries you're trying to do. Many tables, such as friend, can only be used if you're dealing with a logged-in user.
The function me() returns your user id in FQL.
To get the list of your friends, you can use:
SELECT uid, first_name, last_name
FROM user
WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me())
You can find the documentation of this here: http://developers.facebook.com/docs/reference/fql/