Mysql查询选择行,或者匹配其他表上的行

时间:2013-07-21 22:03:40

标签: mysql matching

我有两张桌子:

user
ID ---姓名

posts
ID --- UserID ---文本--- Postdate

现在我要选择所有用户以及他们在过去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
}

您是否有任何想法如何将所有这些信息放在一个查询中?执行这么多查询会使服务器运行速度很慢。

1 个答案:

答案 0 :(得分: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个任意行。