0

我有两张桌子:

user
ID --- 姓名

posts
ID --- 用户 ID --- 文本 --- 发布日期

现在我想选择所有用户以及他们在过去 15 分钟内发布的每个帖子。我还想显示每个根本没有发布具有匹配条件的帖子的用户。

我目前正在这样做:

$user_q = mysql_query("SELECT * FROM user");
while ($a = mysql_fetch_assoc($user_q))
{
     $post_q = mysql_query("SELECT * FROM posts WHERE Userid=".$a['ID']." AND Postdate >= DATE_SUB(NOW(), INTERVAL 15 MINUTE)");
     //Do anything with this information
}

您知道如何将所有这些信息放在一个查询中吗?执行如此多的查询会使服务器运行非常缓慢。

4

1 回答 1

2

你想要的是一个左外连接:

select u.*, p.*
from users u left outer join
     posts p
     on u.id = p.userid and
        p.Postdate >= DATE_SUB(NOW(), INTERVAL 15 MINUTE);

保留第一个表中的left outer join所有行。如果使用条件在第二个表中没有任何匹配项,则这些值适用NULL于这些字段。

编辑:

如果您想将其限制为 50 个随机用户,您可以在以下users级别执行此操作:

select u.*, p.*
from (select u.*
      from users u
      order by rand()
      limit 50
     ) u left outer join
     posts p
     on u.id = p.userid and
        p.Postdate >= DATE_SUB(NOW(), INTERVAL 15 MINUTE);

使order by rand()它们随机。您可以按任何东西订购——名称、创建日期等等。你甚至可以不order by考虑,只取数据库返回的 50 行任意行。

于 2013-07-21T22:06:35.800 回答