0

我有以下查询,它选择了一个朋友请求脚本,该脚本显示了已请求与某个用户成为朋友的用户的个人资料图片、家乡、用户 ID 和全名。

SELECT 
    a.hometown, 
    a.first_name, 
    a.uid, 
    a.last_name, 
    b.friend_one, 
    b.friend_two, 
    b.friend_request_id, 
    p.thumbnail 
FROM 
    users a, 
    friend_requester b, 
    profile_pics p 
WHERE 
    a.uid = b.friend_one 
AND b.friend_two = $uid 
AND p.uid_fk = $uid 
ORDER BY b.created DESC LIMIT 5

我的问题是,我没有为在friend_requester 表中找到的每个查询返回1 个用户,而是返回3 个实例,例如具有不同个人资料图片的同一用户。因此,如果用户上传了 3 张个人资料图片,这些图片将被存储为

id=1, profile_pic=profile_pic1.jpg...

id=1 profile_pic=profile_pic2.jpg... 

id=1 profile_pic=profile_pic3.jpg...

我得到了 3 个不同的同一用户框,要求与登录用户成为朋友。

正如 Hituptony 提到的,我想选择最新插入的图片,该图片来自“创建”列中的“profile_pics”表。

4

3 回答 3

1

GROUP BY Uid_FK,获取创建的最大值并将 INNER 加入图片表(在我的名为“MaxPic”的子查询中完成)

SELECT  a.hometown, 
        a.first_name, 
        a.uid, 
        a.last_name, 
        b.friend_one, 
        b.friend_two, 
        b.friend_request_id, 
        p.thumbnail 
FROM    users a
        INNER JOIN friend_requester b 
            ON b.friend_one = a.uid
        INNER JOIN profile_pics p 
            ON p.uid_fk = b.frind_two
        INNER JOIN
        (   SELECT  uid_FK, MAX(Created) AS Created
            FROM    Profile_Pics
            GROUP BY uid_FK
        ) MaxPic
            ON MaxPic.UID_FK = p.UID_FK
            AND MaxPic.Created = p.Created
WHERE   p.uid_fk = $uid
于 2012-06-11T17:21:42.643 回答
0

如果您可以将新的派生表添加到联接中,则可以执行以下操作:

 SELECT a.hometown, a.first_name, a.uid, a.last_name, 
        b.friend_one, b.friend_two, b.friend_request_id,
        p.thumbnail  
 FROM users a, 
      friend_requester b,
      (Select MAX(Created) as Created, uid_fk from profile_pics) p_date,
      profile_pics p
WHERE      
      a.uid = b.friend_one AND b.friend_two = $uid  AND p.uid_fk = $uid 
      AND p_date.Created=p.Created And p_date.uid_fk=p.uid_fk
ORDER BY b.created DESC LIMIT 5

或者,如果图片是最新的,您可能希望在 pic 表中包含 1 的 'flag' 列,否则为 0, - 这种类型的问题似乎会出现很多,并且作为数据库增长了,而且有更多的旧图片,如果您每次都需要检查每个条目,您会遇到性能问题。使用标志,您可以更轻松地索引性能。此外,此查询只需要添加:where flag=1。每次插入新图片时,将标志设为 1,将所有用户其他图片的标志设为 0。

干杯,大卫

于 2012-06-11T17:33:25.957 回答
0

那你要哪张图?图片应该有一个与之相关的时间戳,也许您可​​以拉出图片的日期并获取最接近 NOW() 或 curdate() 的日期,以显示最近的图片。^^ 我不认为你可以按顺序分组,但你应该选择 b.created,这样你就可以看到它从中检索图片的顺序。

于 2012-06-11T16:46:04.163 回答