查询类似Facebook的新闻源的数据

时间:2009-04-06 14:31:18

标签: php mysql

我有一个社交网站,用户可以更新他们的心情,个人资料和添加照片。

我目前正在使用以下结构在名为“update_log”的表中记录所有更新:

update_id int (auto), 
userid int, 
update_type int (1=profile, 2=photo, 3=mood)
pictureid int
mood_a int
mood_b int
mood_c int
update_time int

个人资料更新记录: (自动),1,1,0,0,0,0,1239003781

照片更新记录: (自动),1,2,11544,0,0,0,1239003781

心情更新记录: (自动),1,3,0,1,490,70,1239003781

对于照片记录,有一个相应的表userphotos,其中包含标题和文件名/位置数据

对于情绪,有一个情绪查找表,其中包含情绪描述(即,我懒惰= \)

我需要做的是查询此数据以显示在用户的个人资料页面上,它会在过去x小时的活动中为他们喜欢的任何用户显示此Feed。

我遇到的问题是,如果用户在半小时或其他时间内上传了五张照片,我只想将其作为Feed中的一行,而不是每张照片上传的条目。

同样适用于个人资料更新。

我需要查询数据,以便用户看到如下内容:

  

用户x更新了他们的心情! (我累了)2009年4月4日晚上10点35分   用户y于2009年4月4日下午10点20分上传了x张新照片   用户x在2009年4月4日下午10:15更新了他们的个人资料

如何将照片更新分组到一个查询中返回的记录中,这些记录基于所有记录,比如说彼此相距一小时?

有没有办法用一个查询来做到这一点?

谢谢!

2 个答案:

答案 0 :(得分:2)

你想要像

这样的东西
SELECT * FROM update_log WHERE update_time > NOW() - 30 MINUTES;

30分钟是你回顾的时间段。

我假设您只需要知道如何在单个查询中返回最近30分钟的更新。

如果您尝试将所有照片组合成30分钟的块,比如说最近两天,您最好更改数据库结构并创建一个photo_group表[包含主键,userid,和创建时间]并将group_id列添加到update_log表。

添加新照片时,请检查该用户在过去30分钟内创建的现有群组。

SELECT * FROM photo_group WHERE user_id = XXX AND created > NOW () - 30 MINUTES;

如果不存在,请创建它。通过将photo_group表的主键添加为update_log中的group_id,将照片链接到最新的。

以后检索行时,可以使用脚本语言按group_id对它们进行分组。

此方法的缺点是您的分组结构以后很难修改,因为当您更改创建新组的规则时,之前的条目将按旧组分组。

如果您想在不存储组的情况下执行此操作,则必须通过将照片分组在一个循环中将照片组合在一起来检查照片的创建时间,对照片中的照片进行分组,从而处理脚本语言中的逻辑如果它们是在特定时间段内创建的,或者使用与之前不匹配的最新照片重新开始循环。这比添加新表的开销更大,但稍后修改起来会更容易。

答案 1 :(得分:0)

您是否考虑过尝试使用PHP而不是SQL查询?查询所需的结果(这些时间之间的所有更新)然后使用PHP来比较时间戳以确定它们应如何分组可能不那么复杂。