【问题标题】:SQL Latest photos from contacts (grouped by contact)SQL 联系人的最新照片(按联系人分组)
【发布时间】:2010-05-18 11:18:27
【问题描述】:

这个问题的简短版本是,一旦你登录,我想完成一些与 Flickr 主页上可见的内容类似的事情。它显示了你每个朋友的三张最新照片,按日期排序,但按朋友分组.

这里有一个更长的解释:例如,我有 3 个朋友:John、George 和 Andrea。我要提取的列表应该是这样的:

乔治

  • 照片 - 2010-05-18
  • 照片 - 2010-05-18
  • 照片 - 2010-05-12

约翰

  • 照片 - 2010-05-17
  • 照片 - 2010-05-14
  • 照片 - 2010-05-12

安德烈亚

  • 照片 - 2010-05-15
  • 照片 - 2010-05-15
  • 照片 - 2010-05-15

上传了最近照片的朋友排在首位,但他或她的下一个文件紧随其后。

我想从 MySQL 做这个,暂时我到了这里:

SELECT photos.user_id, photos.id, photos.date_uploaded
FROM photos
WHERE photos.user_id IN (SELECT user2_id
                         FROM user_relations
                         WHERE user1_id = 8)
ORDER BY date_uploaded DESC 

user1_id = 8 是当前登录的用户,user2_id 是朋友的 ID。这个查询确实返回了 id = 8 按日期排序的用户联系人上传的最新文件。但是我想完成上面提到的分组和限制。

希望这是有道理的。提前谢谢你。

【问题讨论】:

  • 如果不是每个朋友的三行,而是每个朋友的三列,每列包含一张照片,是否可以接受?
  • 并非如此。您指的是 GROUP_CONCAT 吗?
  • 不,但我认为它可能有一行,例如userid: 1, photo1_id: 200, photo1_date: 2009-10-01, photo2_id: 167, photo2_date: 2009-08-01, photo3_id: 120, photo3_date: 2009-06-01。每个朋友都有相似的行。
  • 这太过分了,所以我想我会使用下面提供的多个查询选项。

标签: sql mysql social-networking


【解决方案1】:

有时,达到目的的唯一方法是创建一段如此丑陋和令人发指的 SQL,以至于执行多个查询的替代方案变得很有吸引力:-)

我只需执行一次查询以获取您的朋友列表,然后为每个朋友获取最近的三张照片。比如:

friend_list = sqlexec "select user2_id from relations where user1_id = "
                      + current_user_id
photolist = []
for friend in friend_list:
    photolist += sqlexec "select user_id, id, date_uploaded from photos"
                 + " where user_id = "
                 + friend.get("user2_id")
                 + " order by date_uploaded desc fetch first 3 rows only"

# Now do something with photolist

您不必将其作为一个查询来执行,就像您仅限于一个正则表达式来匹配令人发指的模式一样。当然,“聪明”会很好,但很少有必要。我更喜欢务实的方法。

【讨论】:

  • 然后你按顶部照片的日期对结果数组/哈希进行排序。
  • +1 ...有些东西只需要在代码中格式化,SQL并不意味着完全通用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 2017-07-10
相关资源
最近更新 更多