2012-09-03 6 views
0

현재 쿼리에서 지정된 시간부터 내 벽에 게시 된 일부 메시지를 표시합니다.uid 대신 실제 이름 표시

$fql = "SELECT post_id, actor_id, target_id, message FROM " . 
     "stream WHERE filter_key = 'others' AND created_time > 1346277600 LIMIT 50"; 

문제는 내 벽에 메시지를 게시 한 사람의 실제 이름 대신 uid 만 표시된다는 것입니다.

편집 : 지금 이제 multiquery

$fql = "{" . 
    "\"user_stream\" : \"SELECT post_id, actor_id, target_id, message FROM stream WHERE " . 
    " filter_key = 'others' AND created_time > 1346277600 LIMIT 50 \"" . 
    "\"actor_info\" : \"SELECT uid, name FROM user " . 
    " WHERE uid IN (SELECT actor_id, target_id FROM #user_stream)\"" . 
"}"; 

$data['msgs'] = $this->facebook->api(array(
    'method' => 'fql.multiquery', 
    'queries' => $fql, 
    'access_token'=>$facebook['access_token'] 
)); 

을 사용하여 내가 하늘의 배열을 얻을하지만 내 일반 쿼리 나는이로 29

$fql = "SELECT post_id, actor_id, target_id, message FROM " . 
     "stream WHERE filter_key = 'others' AND created_time > 1346277600 LIMIT 50" 
+0

먼저 명령 줄에서 쿼리를 확인하십시오. – Nishant

+0

그래, 작동하지 않는 걸 알아. FQL에서 몇 가지 쿼리를 작성하고 원하는 출력을 표시하는 것은 매우 어렵습니다. – MegaNairda

+0

facebook 멀티 쿼리 시도 ... – Abhishek

답변

5

사용 페이스 북 multiquery.

페이스 북 API에 대한 더 많은 호출이 줄어 듭니다. 필요한 출력을 얻으려면 결과를 처리해야합니다.

$multiQuery = array(
     "query1" => "SELECT actor_id, message FROM stream WHERE filter_key = 'others' AND created_time > 1346277600 LIMIT 50", 
     "query2" => "SELECT uid,first_name, last_name FROM user WHERE uid in (SELECT actor_id FROM #query1)", 
     "query3" => "SELECT page_id,name FROM page WHERE page_id in (SELECT actor_id FROM #query1)", 
     ); 

$param = array(  
    'method' => 'fql.multiquery',  
    'queries' => $multiQuery,  
    'callback' => '');  
$queryresults = $facebook->api($param); 

$result = array(); 

foreach($queryresults[0]['fql_result_set'] as $message){ 
    $message_ = $message; 
    $actor_ = 'page'; 
    foreach($queryresults[1]['fql_result_set'] as $actor){ 
     if($actor['uid'] == $message['actor_id']){ 
      $actor_ = $actor; 
      break; 
     } 
    } 
    if($actor_ == 'page'){ 
     foreach($queryresults[2]['fql_result_set'] as $actor){ 
     if($actor['page_id'] == $message['actor_id']){ 
      $actor_ = $actor; 
      break; 
     } 
    } 
    } 
    $result[] = array('message'=>$message_,'actor'=>$actor_); 
} 
print_r($result); 

은 내 결과 처리가 최적화되지 가질 수 있으며, 또는 가장, 당신은 :) 더 나은 만들 수 있습니다.

일부 액터는 Facebook 페이지가 될 수 있으므로 'query3'을 사용하여 페이지 세부 정보를 가져옵니다.

0

join을 사용 할 수 있습니다 얻을하지만 FQL은 '아무튼 t 지원 조인 :

FQL FROM 절에는 단일 테이블 만 포함됩니다. SELECT 또는 WHERE 절에 IN 키워드를 사용하여 하위 쿼리를 수행 할 수 있지만 하위 쿼리는 외부 쿼리의 범위에있는 변수를 참조 할 수 없습니다.

그래서 uid를 먼저 검색 한 다음 first_name 및 last_name을 검색 할 수 있습니다.

SELECT post_id, actor_id, target_id, message FROM stream WHERE 
filter_key = 'others' AND created_time > 1346277600 LIMIT 50 

그런 다음이를 사용

,

SELECT name FROM user WHERE uid in ($row[actor_id], $row[target_id]) 
+0

쿼리의 문제점은 메시지가 출력에서 ​​손실된다는 것입니다. – MegaNairda

+0

@MegaNairda 업데이트를 확인했습니다. – Vinay

+0

실제로 코드를 적용하는 방법을 모르겠습니다. 다중 쿼리입니까? 제 사용법을 자세히 설명해주세요. – MegaNairda

관련 문제