Mysql子查询失败,需要帮助:)

时间:2010-01-20 01:34:58

标签: php sql mysql subquery greatest-n-per-group

我有一张表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 个答案:

答案 0 :(得分:2)

尝试在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;

答案 1 :(得分: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张照片

答案 2 :(得分:2)

我认为你的意思是你想要来自每个朋友的最新5张照片,而不是所有朋友照片中的最新5张照片。

这是StackOverflow上频繁出现的greatest-n-per-group问题之一。通常问题是从每个组中找到顶部一个,但是当你想要前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;

说明:对于属于我的一个朋友的每张图片p1,请计算属于同一朋友的图片以及更近的日期时间。最近5张图片中的图片必须少于5张更多最近的其他图片。

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