我有以下查询选择一个朋友请求脚本,该脚本显示配置文件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'表。
答案 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和所有用户的标记设置为其他图片。
干杯, 大卫