FQL returns only one photo - facebook-fql

I use this query:
SELECT pid FROM photo WHERE owner=$friend_id;
It works fine, but for some users(that has more than 1 photo) this query returns only 1 record.
Then i tried this query:
SELECT pid FROM photo WHERE owner=$friend_id LIMIT 10;
But returned result is the same - only 1 record.
Permissions :
user_activities,
user_photos,
friends_activities,
friends_photos,
publish_stream
What i have to do to get correct result for anyone user??

This depends on the friend's privacy settings for the albums and photos he/she shares/uploads.
Also, I noticed that the owner field in the photo table is not indexable but it is in the album table and hence you may need to use something like:
SELECT pid FROM photo WHERE owner = XXXXXX AND aid IN (
SELECT aid FROM album WHERE owner = XXXXXX
)

Related

Get list of people who liked a status through FQL

I can get the number of likes on a status through this FQL query -
SELECT like_info,
message,
status_id,
time,
uid
FROM status
WHERE uid = me()
I'd like to get the separate user ID's of the likes (if not possible for friends of the authenticated user, just the user himself/herself). It's possible through the Graph API through a command like this -
me/?fields=statuses
Is the same thing possible through FQL?
You can select IDs from status table for user and then use them to select data from like table
SELECT user_id,
object_id
FROM like
WHERE object_id IN(
SELECT status_id
FROM status
WHERE uid = me() )
You may group result by object_id on your side.

Incorrect/incomplete results from FQL

So, I need to get the most recent photos from my friends. I tried running some queries from my code as well as from the FQL explorer at http://developers.facebook.com/tools/explorer
The following query never returns.
SELECT src_big, created, owner FROM photo WHERE owner in (select uid2 from friend where uid1=me()) order by created desc
Perhaps not a good idea to use the WHERE clause on owner, even though the FQL docs do say owner is indexed. So, I modified it to:
SELECT src_big, created, owner FROM photo WHERE aid in (select aid from album where owner in (select uid2 from friend where uid1=me())) order by created desc limit 2000
and that does return but only returns photos from 3 of my friends and the total photo count is nowhere close to 2000.
I tried restricting the results to only photos created in the last 7 days.
SELECT src_big, created, owner FROM photo WHERE aid in (select aid from album where owner in (select uid2 from friend where uid1=me())) and created > 1361570941 order by created desc limit 2000
Now I get only 1 photo (obviously from 1 owner).
Then I tried the last 365 days.
SELECT src_big, created, owner FROM photo WHERE aid in (select aid from album where owner in (select uid2 from friend where uid1=me())) and created > 1330639808 order by created desc limit 2000
Now I got more photos, but still not 2000, and again only from those 3 owners.
If I now loop through each of my friends and run this query:
SELECT src_big, created, owner FROM photo WHERE owner = and created > 1330639808 order by created desc limit 100
then I get proper results, and eventually when I am done with all friends I have photos from 202 friends, and if I sort the overall result by created, those aforementioned 3 owners don't dominate the top rows. There are many owners who have posted photos in the top 2000 spots, so the previous queries are clearly returning incorrect (incomplete) data.
But the last way to do it (loop through all friends) is terrible for performance compared to the previous queries - we are talking several minutes instead of a few seconds.
Is this a known problem or limitation? Any workarounds?
A Facebook employee friend of mine suggested using multi-queries as in:
{
"p1" : "SELECT src_big, created, owner FROM photo WHERE owner = 4850 AND created > 1341203410",
"p2" : "SELECT src_big, created, owner FROM photo WHERE owner = 5569 AND created > 1341203410"
}
I haven't tried it out yet, but I am guessing it will be much faster than making an API call per friend.
He said he will file a bug on the incorrect results from my original query.

FQL: Selecting friend's photos

This FQL attempting to fetch photos for my friends
[1]
{"query1":"SELECT owner, object_id, src_big FROM photo
WHERE owner IN (SELECT uid2 FROM friend WHERE uid1=me())"}
provides this error response after thinking for a few seconds...
{"error_code":1,"error_msg":"An unknown error occurred"}
But this query to fetch albums for my friends will work and return a JSON object of album info
[2]
{"query1":"SELECT aid, owner, name FROM album
WHERE owner IN (SELECT uid2 FROM friend WHERE uid1=me())"}
Why does [2] work but not [1]?
Indeed, that is strange. But this one does what you want:
SELECT owner, object_id, src_big
FROM photo WHERE aid IN (
SELECT aid FROM album WHERE owner in (
SELECT uid2 FROM friend WHERE uid1=me()
)
)
Have fun with pagination!
Query [1] returns all photo objects, whereas query [2] returns album objects. The number of photos will most of the times be much larger than the number of albums. So if each friend has 10 albums each with 100 photos, the query size increases and since FQL doesn't use any form of pagination you are pulling all at once.
Consider using multi-queries in the future or batch with LIMITS

FQL with limit do not return results for all users

Im tryint to get the following query to return results for two of my friends:
SELECT pid, owner
FROM photo
WHERE aid IN (
SELECT aid
FROM album
WHERE owner in (
SELECT uid2
FROM friend
WHERE uid1=me()
LIMIT 0, 2 ) )
But for some reason it does only show result for one of them, and the number of rows returned is not above the limit (only about 800)
When I run:
SELECT uid2
FROM friend
WHERE uid1=me()
LIMIT 0, 2
I get a result with two friends, as expected and when I manually do a query in this form:
SELECT pid, owner
FROM photo
WHERE aid IN (
SELECT aid
FROM album
WHERE owner = USER_ID_FROM_LAST_QUERY
I get the result Id expect for both users, but Why wont it work with the IN-statement and subquery?
Edit: What I try to achieve is to get the photos of all my friends. And just asking for all photos from ALL my friends would be more then 5000 photos, and thus I cant get everything in 1 query.
Currently I got it working by doing a query for each user, to get all his pictures - and it works fine. (if you ignore the fact that it takes 2-3 minutes to execute. So I want to shorten the runtime by doing fewer queries.
Edit: more info:
With the following query i get albums from both users:
SELECT aid, owner
FROM album
WHERE owner in (
SELECT uid2
FROM friend
WHERE uid1=me()
LIMIT 0, 2 )
But with the full query, i only get pictures from albums owned by one of those users.
Try This:
SELECT pid, owner FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner in (SELECT uid2 FROM friend WHERE uid1=me() LIMIT 2 ) )

one fql to get photo with owner name

I am writing a fql as below.
fql='SELECT caption, owner, pid, src_big, created FROM photo WHERE aid IN ( SELECT aid FROM album WHERE owner IN (11111) ) LIMIT 1,5';
The problem is: how to write one fql to get the owner name also?
Thanks.
You may get owner name by joining the two tables photo and album. I am not sure how your table columns are but i suppose you must have an pid in album table so you can link tables likes this.
SELECT caption, owner, pid, src_big, created FROM photo LEFT JOIN album ON photo.pid=album.pid where aid IN (11111) LIMIT 1,5