0

私は2つのテーブルを持っています:

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 つのクエリにまとめる方法について何かアイデアはありますか? 非常に多くのクエリを実行すると、サーバーの実行が非常に遅くなります。

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、すべての行を最初のテーブルに保持します。条件を使用して 2 番目のテーブルに一致するものがない場合、値は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 に答える