【问题标题】:Querying data for a Facebook-like news feed为类似 Facebook 的新闻提要查询数据
【发布时间】:2009-04-06 14:31:18
【问题描述】:

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

我目前正在使用以下结构将所有更新记录在名为“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 小时的活动中为他们最喜欢的任何用户显示此提要。

我遇到的问题是,如果用户在半小时左右的时间内上传了五张照片,我只希望它成为提要中的一行,而不是每张照片上传的条目。

个人资料更新也是如此。

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

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

我如何将照片更新分组到一个查询中返回的记录中,基于所有记录在一个小时内?

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

谢谢!

【问题讨论】:

  • 如果用户在 24 小时内每 30 分钟上传 1 张照片会怎样?您想要单行 48 张照片吗?
  • 我不确定。我一直在尝试用 PHP 解析这些数据,实际上我变得比开始时更加困惑。该死的。

标签: php mysql


【解决方案1】:

你想要类似的东西

SELECT * FROM update_log WHERE update_time > NOW() - 30 MINUTES;

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

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

如果您尝试将所有照片组合成 30 分钟的块,例如过去两天,您最好更改数据库结构并创建一个 photo_group 表 [包含主键、用户 ID、和创建时间] 并将 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 对它们进行分组。

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

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

【讨论】:

  • 是的,我知道它会将所有照片上传或个人资料更新在一小时内分组,这会带来一些困难。
  • 嗯,很有趣。我真的很想避免更多开销,即添加一个新表,但值得考虑。我想的更像是一个联合查询,第一个是个人资料,第二个照片和第三个心情。第二个会做一些分组并返回 ph grp 中的顶部更新 id
  • 那么你觉得哪个更贵?分组表或仅查询“原始”数据并在 PHP 中解析结果?我认为必须有某种方法可以使用 MySQL 查询来做到这一点,即联合查询 w/1 用于配置文件更新,1 用于照片,1 用于情绪,但听起来你不认为这是可能的
  • 在 PHP 中解析数据几乎总是比在数据库中存储数据的成本更高。也就是说,我对您的表结构了解不足,无法提出任何联合建议。
  • 如果这些类型的更新是单独的类型(例如:您可以在没有照片的情况下更新心情),并且其中一个结果可以为空,那么您的照片记录应该包含 update_log 的主键,而不是相反。这使您可以在一次更新中拥有多张照片。
【解决方案2】:

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

【讨论】:

  • 我还没有考虑过。所以你是说在 24 小时内取回所有内容,并通过循环遍历结果来解析 PHP 中的数据?什么会有更多的开销,或者是一个 MySQL 查询来完成大部分工作?
  • 这正是我的意思;比较时间戳并相应地分组。我不是开销专家,但我猜 MySQL 查询更快。如上面其中一个 cmets 所述,在 PHP 中进行解析可能会更容易,但代价是页面加载速度较慢(取决于数据量)
猜你喜欢
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
相关资源
最近更新 更多