我有两张桌子:
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
}
您是否有任何想法如何将所有这些信息放在一个查询中?执行这么多查询会使服务器运行速度很慢。
答案 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个任意行。