0

我正在尝试从表“用户”中获取 10 个随机行,以及从表“Profile_pictures”中获取匹配的个人资料图片。

到目前为止我的查询:

SELECT u.id, u.username, u.status, p.file_name
FROM users AS u, profile_pictures AS p
WHERE p.status = 1 AND u.status != 3 AND u.status != 4
AND RAND()<(SELECT ((1/COUNT(*))*10) FROM users AS u)
GROUP BY u.id
ORDER BY RAND()
LIMIT 7

问题是它为所有行获取相同的个人资料图片。

我真的,真的希望你能帮助我。

4

2 回答 2

1

如果您想从用户那里获得 10 个随机行,那么您应该users在连接之前在子查询中进行选择:

SELECT u.id, u.username, u.status, p.file_name
FROM (select u.*
      from users u
      where u.status <> 3 AND u.status <> 4
      order by rand()
      limit 10
     ) u7 join
     profile_pictures p
     on u.id = p.user_id and p.status = 1;

这也修复了连接表示法。如果你想要用户的10张随机图片,你可以在加入后进行选择:

SELECT u.id, u.username, u.status, p.file_name
FROM users u join
     profile_pictures p
     on u.id = p.user_id
where u.status <> 3 AND u.status <> 4 and p.status = 1
order by rand()
limit 10;

顺便说一句,这也修复了连接。大概有一个用户 id 字段将图片连接到用户。

于 2013-09-09T01:02:20.250 回答
0

使用 LEFT JOIN 语句将用户与他们的图片进行匹配。我假设 profile_pictures 有一个名为 user_id 的列用于匹配它们。LEFT JOIN 将返回用户,无论他们是否有图片。如果您只想返回有图片的用户,请改用 INNER JOIN。

SELECT u.id, u.username, u.status, p.file_name
FROM users AS u
LEFT JOIN profile_pictures AS p ON u.id = p.user_id
WHERE p.status = 1 AND u.status != 3 AND u.status != 4
ORDER BY RAND()
LIMIT 7

这条线RAND()<(SELECT ((1/COUNT(*))*10) FROM users AS u)看起来没有必要,所以我把它拿出来了。它在那里是为了什么?

于 2013-09-09T00:11:08.293 回答