【问题标题】:Fetching random rows, along with matching rows from another table?获取随机行以及来自另一个表的匹配行?
【发布时间】:2013-09-09 00:05:44
【问题描述】:

我正在尝试从表“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

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

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

【问题讨论】:

  • RAND()&lt;(SELECT ((1/COUNT(*))*10) FROM users AS u)的目的是什么?

标签: php mysql sql


【解决方案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 字段将图片与用户联系起来。

【讨论】:

    【解决方案2】:

    使用 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()&lt;(SELECT ((1/COUNT(*))*10) FROM users AS u) 这行看起来没必要,所以我把它拿出来了。它是干什么用的?

    【讨论】:

    • 太棒了!太感谢了。但是,人们不只是像我一开始那样使用 ORDER BY RAND() 的原因是什么?这是一个相当大的网站,所以如果随着用户群的增长,这个查询会继续快速,那就太好了..
    • 我认为ORDER BY RAND() 没有问题。
    猜你喜欢
    • 2016-02-12
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2014-02-27
    • 2021-12-04
    • 2012-12-20
    • 2015-06-06
    • 2018-09-14
    相关资源
    最近更新 更多