我正在尝试从表'users'中获取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
问题在于它为所有行获取了相同的个人资料图片。
我真的,真的希望你可以帮助我。
答案 0 :(得分: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字段将图片连接到用户。
答案 1 :(得分: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)
看起来没必要,所以我把它拿出来了。它有什么用?