SQL选择用户

时间:2012-06-11 16:40:20

标签: php mysql sql

我有以下查询选择一个朋友请求脚本,该脚本显示配置文件pic,hometown,userid以及请求与某个用户成为朋友的用户的全名。

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所提到的,我想要选择最新插入的图片,该图片将来自'created'列中的'profile_pics'表。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

答案 2 :(得分: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,如果图片是最新的,否则为0, - 这种类型的问题似乎会出现很多,并且随着数据库的增长,并且有旧的图片,你如果您需要每次检查每个条目,将会出现性能问题。使用标志,您可以更轻松地为性能编制索引。此外,此查询只需要添加:where flag = 1。每次插入新图片时,都会将标记1和所有用户的标记设置为其他图片。

干杯, 大卫