Get photos from stream - facebook-fql

Is there a way to get all of the photos form a given stream query? I tried the following but it returns an empty set.
SELECT pid, aid, src_big FROM photo WHERE pid IN (SELECT attachment.media.photo.pid FROM #feed)

Its tough to tell since I can't see your '#feed' query but more than likely you are missing a stream_filter query. This would give you something like the following 3 queries. Good Luck!
Query 'key':
SELECT filter_key
FROM stream_filter
WHERE uid = me() AND name = 'Photos'
Query 'feed':
SELECT attachment.media.photo.pid
FROM stream
WHERE source_id = {id here} AND filter_key IN (SELECT filter FROM #key)
Query 'photos':
SELECT caption, src_big, modified
FROM photo
WHERE pid IN (SELECT pid FROM #feed)

Related

FQL Multiquery writing join queries

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}

FQL not returning photos tagged with friend

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()

Facebook FQL Query OR

I am trying to create an OR clause in FQL query.
Here is my query :
SELECT post_id, message, permalink, likes, actor_id, created_time FROM stream WHERE
(source_id = xxx1 AND message != '' AND actor_id = xxx2)
OR
(source_id = xxx2 AND actor_id = xxx1)
Globally I want to retrieve all the messages between 2 Facebook users.
If I remove the OR clause I do receive messages in one way but adding the OR removes every messages I have as if the '(' do not work.
If you need to test this query please go on : http://developers.facebook.com/tools/explorer
and create and access token with the read_stream permission (Extended Permissions)
I also wanted to use a UNION but it is not supported by FQL.
Maybe I could use FQL multiple queries but I was still blocked by the UNION missing.
Thank you for your help.
You can use sub queries to achieve the desired result like this:
SELECT post_id, message FROM stream
WHERE
(
post_id in (select post_id from stream where actor_id = uid0 and source_id = uid1)
or
post_id in (select post_id from stream where actor_id = uid1 and source_id = uid0)
)
and message != ''
The answer provided by complex857 is correct but I would like to add some information.
To make this query work you must add a LIMIT / OFFSET clause to your query.
SELECT post_id FROM stream
WHERE
(post_id IN (SELECT post_id FROM stream WHERE source_id = uid0 AND actor_id = uid1 LIMIT 1000 OFFSET 0)
OR
post_id IN (SELECT post_id FROM stream WHERE source_id = uid1 AND actor_id = uid0 LIMIT 1000 OFFSET 0))
AND message != '';
Hope this will help :)

FQL statement to get a photo of two people (Query not indexable error)

SELECT pid FROM photo WHERE me() and $otherPerson IN ( SELECT subject FROM photo_tag WHERE pid=pid ) ORDER BY created DESC LIMIT 1
I'm trying to get a photo that has both users tagged in it ($otherPerson is replaced with a user id). This query returns:
604 Your statement is not indexable. The WHERE clause must contain an indexable column. Such columns are marked with * in the tables linked from http://wiki.developers.facebook.com/index.php/FQL_Tables
Any ideas on how I can make this work?
UPDATE:
I currently have this query working but I feel as though there's a better way to go about.
SELECT pid, src_big FROM photo
WHERE pid IN (
SELECT pid FROM photo_tag
WHERE subject=$otherGuy
AND pid in (
SELECT pid FROM photo_tag WHERE subject=me()
)
)
This should do the trick.
SELECT pid, src_big
FROM photo
WHERE pid IN(
SELECT pid
FROM photo_tag
WHERE subject = me()
)
AND pid IN(
SELECT pid
FROM photo_tag
WHERE subject = <friend_user_id>
)
What about:
SELECT pid
FROM photo
WHERE me() IN (SELECT subject
FROM photo_tag
WHERE pid=pid)
AND $otherPerson IN (SELECT subject
FROM photo_tag
WHERE pid=pid)
ORDER BY created DESC
LIMIT 1
Also, what pid=pid means?
I tried the other solutions and ran into a problem - If your friend has set his privacy settings to disallow apps from accessing his photos, then the following FQL query will return an empty table:
"SELECT pid FROM photo_tag WHERE subject = <friend_user_id>"
I solved this by using the following multiquery instead:
"query1" : "SELECT subject, pid FROM photo_tag WHERE pid IN (SELECT pid FROM photo_tag WHERE subject=me())"
"query2" : "SELECT pid FROM #query1 WHERE subject= <friend_user_id>"

Facebook FQL queries return {}

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.