我正在玩facebook api,而且有些问题,我使用Multiquerying来获取用户喜欢的所有页面。 所以我拨打一个电话来获取用户喜欢的所有页面,而不是打电话来获取页面的名称。我最终得到了2个列表,一个是page_ids,另一个是page_names:
queries.add("SELECT uid,page_id,created_time FROM page_fan WHEREuid="+userId,"page_likes");
queries.add("SELECT name,page_url FROM page WHERE page_id IN (SELECT page_id FROM #page_likes)","pagedata");
有没有一种方法,而不是显示2个列表,生病得到一个列表,其中显示页面名称下的页面名称?这样的事情: “123214211” - > “coca”,“123213” - >“pepsi”
这比仅仅2个列表更有用,你需要在它们之间进行连接。 让我说我需要得到照片的评论,所以生病有一个查询照片,第二次查询评论。但我怎么知道哪些评论适合哪张照片?
提前致谢
答案 0 :(得分:1)
我没有亲自使用Facebook的API,但是从这里看过来就是我能说的。它们不允许在单个查询中标识多个表/实体,并且从我可以看到的意味着无法在查询中使用任何类型的JOIN,这基本上就是您所要求的。几乎所有关系数据库系统都能够进行JOIN但我认为Facebook可能选择不允许此选项确保使用其API的第三方不会创建过于复杂的SQL,这会使他们的服务器有更多的时间来处理。我认为你只需编写一个AS3方法来处理两个列表的组合,我相信这可以用一般的方式编写,它可以在不修改方法的情况下重复使用。我的建议是创建一个具有两个属性的“包装类”,一个具有声明类型的Object,另一个类型为某种类型的Collection。我建议如下(伪代码,尽可能接近现实而不实际测试:)):
public class JoinWrapper
{
public var originalObject:Object;
public var childrenCollection:ArrayCollection = new ArrayCollection();
}
public class JoinUtil
{
public static function joinThings(query1Results:ArrayCollection, query1JoinProperty:String, query2Results:ArrayCollection, query2JoinProperty:String):ArrayCollection
{
var tempCollection:ArrayCollection = new ArrayCollection();
for each(var object:Object in query1Results)
{
var jw:JoinWrapper = new JoinWrapper();
jw.originalObject = object;
for each(var anotherObject:Object in query2Results)
{
if(object[query1JoinProperty]==anotherObject[query2JoinProperty])
jw.childrenCollection.addItem(anotherObject);
}
tempCollection.addItem(jw);
}
return tempCollection
}
}