2013-05-04 2 views
2

제목에서 알 수 있듯이 현재 로그인 한 사용자와 친구 중 한 명 이상이 태그 된 최대 10 개의 사진을 가져 오려고합니다. 현재 PHP API 및 FQL을 사용하여이 작업을 수행하려고합니다.두 명 이상이 태그 된 사진을 가져 오는 중

내가 FQL에 새로운 해요,하지만 등 내가 동적으로 다음과 같이 여러 쿼리를 구축하는 것입니다 원하는 것을 달성하기 위해 현재 수 있어요 유일한 방법 프로그래밍 새로운 것이 아니다 : 그렇다

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 = '1530195' OR 
    subject = '3612831' OR 
    subject = '6912041' OR 
    ... 
) 

에서을 못생긴, 이것은 느리다. 검색어는 오래 걸릴 때 실패하기 때문에 위에 표시된 길이로 제한됩니다. 내가 '로'사용할 수 없기 때문에

다중 쿼리는 나에게 도움이되지 않았다,하지만 SQL은 나의 가장 큰 힘없는 나는 정말 내가 뭔가를 놓친 적이 바라고 있어요 ..

이 있어야합니다 더 좋은 방법! 누군가?

답변

0

두 개의 쿼리를 사용하고 선택한 프로그래밍 언어로 교차를 수행하십시오. SELECT subject, pid FROM photo_tag WHERE subject = me()

  • SELECT pid, subject FROM photo_tag WHERE subject IN (SELECT uid2 FROM friend WHERE uid1=me())

배치이 두 통화

fql?q={"userphotos":"SELECT subject, pid 
        FROM photo_tag 
        WHERE subject = me()", 
     "friendphotos":"SELECT pid, subject 
         FROM photo_tag 
         WHERE subject IN 
         (SELECT uid2 FROM friend WHERE uid1=me())"} 

는 그런 다음 프로그래밍 언어로이 두 세트의 교차점을한다.

파이썬에서 예를 들어

a0 = data['data'][0]['fql_result_set'] a1 = data['data'][1]['fql_result_set']

,

>>> photos = {} 
>>> for p in a0: 
...  for q in a1: 
...   if p['pid'] == q['pid']: 
...    pid = p['pid'] 
...    if pid in photos: 
...     photos[pid].append(p['subject']) 
...    else: 
...     photos[pid] = [q['subject']] 
...     photos[pid].append(p['subject']) 

사진 같은 간단한 각 키 값으로 ID의 목록을 가지고있는 딕셔너리를 제공 할 것입니다. 의인은 이들의 10를 가지고 가장 느린 부분은 전체 친구에 photo_tag 쿼리 것이

photoquery = 'SELECT pid, src_big FROM photo WHERE '+ 
      'pid ='+pid1+' OR 
      'pid ='+pid2+' OR 
       ... 

graph.fql(photoquery) 

처럼 보일 수있는 facepy 모듈을 파이썬에서

전화 FQL photo 테이블에 제공합니다. SELECT pid, subject FROM photo_tag WHERE subject IN (SELECT uid2 FROM friend WHERE uid1=me())

+0

고마워요. 이것은 거의 작동하지만 이상한 점은'SELECT subject, pid from photo_tag WHERE subject = me()'를 다중 쿼리의 일부로 사용하면 많은 친구 사진을 반환한다는 것입니다. 그러나 하나의 쿼리와 정확히 같은 FQL 요청을 발행하면 필요한 작업을 수행하고 나 사진을 반환합니다. 이것의 최종 결과는 (아주 좋은) 나머지 로직과 결합 할 때 실제로 2 명이 태그 된 사진을 얻는다는 것입니다. 그러나 그들 중 하나가 아닙니다. –

+0

@MikeTimberlake는 1을 붙여 넣을 수 있습니까?) 멀티 쿼리 응답에서 각 데이터 세트의 스 니펫 (snippet) 2) 로직 구현. 쿼리가 요청한 것을 반환하지 않는 경우, 특히'subject = me ' – phwd

+0

[여기를보십시오] (http://pastebin.com/eaiRygeM) 충분히 명확 해지기를 바랍니다. 어쩌면 멀티 쿼리를 잘못하고있는 것일까 요? –

0

이 성능이 향상됩니다 .. 그러나 적어도, 그것은 당신의 쿼리를 읽기 쉽게 만들 수있는 방법을 많이 확실하지 :

당신은 사용자 ID의 목록은 OR xxx OR yyy 형식 대신 익숙한 WHERE IN (...) 문을 사용할 수 있습니다 ...

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 IN(
    '1530195', 
    '3612831', 
    '36800240', 
    ... 
) 

사용자 친구의 전체 목록과 관련된 이러한 종류의 쿼리는 여러 가지 이유로 인해 문제가되는 경향이 있습니다. 첫째로 친구가 수백 명에 달할 수 있으므로 한 쿼리의 성능을 향상 시키더라도 사용자의 전체 친구 목록을 반복하는 일련의 쿼리를 실행해야합니다. 두 번째로 이러한 종류의 집중적 인 쿼리를 API에서 차례로 실행하면 애플리케이션의 스로틀 링을 유발할 수 있습니다 ...

내가 제안 할 수있는 것은 사용자에게 집중적 인 작업을 수행하고 있음을 알리는 것입니다 "잠시 걸릴 수도 있습니다."P 쿼리를 실행해야 할 장면을 암시하고 심지어 각 쿼리에 제한을 두어 페이스 북 측에서 API에 대한 액세스를 제한 할 수있는 일부 메커니즘을 트리거하지 않도록 할 수 있습니다.

모든 사용자 친구를 선택하고 친구 목록을 표시하고 상호 사진을 검색 할 친구를 결정할 수있는 또 다른 옵션 (응용 프로그램 흐름을 약간 변경해야 할 수도 있음)이 있습니다. 또한 실제 u 리 수를 제한 할 수 있습니다.

+0

입력 해 주셔서 감사합니다. 나에게 매우 가치있는 일이다. 당신이 이것을 분명히하는 방법을 놓치지 않았다는 것을 확인했다. 천억 달러짜리 웹 사이트의 API가 너무 약하다는 것을 받아들이는 데 오랜 시간이 걸렸다. 필자가 보여준 코드는 프로그래밍 방식으로 작성된 적이 없으며, 최대 문자열 길이 문제를 피하기 위해 가능한 한 쿼리를 짧게 만들도록 작성했습니다. 나는 이걸 포기해야하는 것처럼 보입니다. 단지 최대 10 장의 이미지 만 필요하지만, 완료되면 깨질 수 있습니다. 너무 느리고 FB는 마음에 들지 않을 수도 있습니다. –

관련 문제