0

我有一张桌子PICTURES

username varchar(50) 
picture_id varchar(50) 
datetime 

...我有一张桌子FRIENDS

user_1 varchar(50) 
user_2 varchar(50)  
datetime 

当您在网站上有朋友时,您的用户名进入user_1,您的朋友用户名进入user_2。对于每个新朋友一个新行...

我想显示一个用户 (user_1) 的朋友的最后 5 张照片

所以我尝试

SELECT p.picture_id, p.datetime
FROM pictures AS p
WHERE p.username = (
    SELECT f.user_2
    FROM friends AS f
    WHERE f.user_1 = '(ENTER USERNAME HERE)'
    ORDER BY f.datetime DESC
    LIMIT 5
)
ORDER BY p.datetime DESC;

如您所见,子查询返回不止一行,所以...我需要您的帮助或建议来帮助我管理此解决方案!

4

4 回答 4

2

尝试使用IN而不是=in WHERE p.username = (。由于您最多选择 5 行=并没有多大意义。

SELECT p.picture_id, p.datetime
FROM pictures AS p
WHERE p.username IN (
    SELECT f.user_2
    FROM friends AS f
    WHERE f.user_1 = '(ENTER USERNAME HERE)'
    ORDER BY f.datetime DESC
    LIMIT 5
)
ORDER BY p.datetime DESC;
于 2010-01-20T01:38:22.850 回答
2

我建议你尝试一个JOIN

SELECT
    p.picture_id, p.datetime
FROM 
    friends AS f 
    INNER JOIN pictures AS p ON f.user_2 = p.username
WHERE
    f.user_1 = '(ENTER USERNAME HERE)'
ORDER BY
    p.datetime DESC
LIMIT 5

这将为您提供来自任何user_1朋友的最后 5 张照片

于 2010-01-20T01:44:07.427 回答
2

我假设您的意思是您想要每个朋友的最新 5 张照片,而不是所有朋友照片中的最新 5 张照片。

这是greatest-n-per-groupStackOverflow 上经常出现的问题之一。通常问题是从每个组中找到前一个,但是当你想要前 5 个或其他数量时,我是这样解决的:

SELECT p1.*
FROM friends AS f
JOIN pictures AS p1 ON (f.user_2 = p1.username)
LEFT OUTER JOIN pictures AS p2 ON (p1.username = p2.username
    AND p1.datetime < p2.datetime)
WHERE f.user_1 = ?
GROUP BY p1.picture_id
HAVING COUNT(*) < 5;

Explanation: for each picture p1 that belongs to one of my friends, count the pictures belonging to the same friend and with a more recent datetime. The pictures that are in the most 5 recent must have fewer than 5 other pictures that are more recent.

于 2010-01-20T03:49:03.720 回答
0

尝试更改WHERE p.username =(subquery)WHERE p.username in(subquery)

SELECT p.picture_id, p.datetime FROM Pictures AS p WHERE p.username IN (SELECT f.user_2 FROM friends AS f WHERE f.user_1 = '(ENTER USERNAME HERE)' ORDER BY f.datetime DESC LIMIT 5) ORDER BY p .datetime DESC;

于 2010-01-20T01:38:46.453 回答