SQL 选择用户


SQL Select user

>我有以下查询,该查询选择一个好友请求脚本,该脚本显示个人资料图片、家乡、用户 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"表。

按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

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

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

 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

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

干杯大卫