2011-11-02 14 views
5

SQLジョインと物事について学ぶだけで、質問があります。php sql update join

更新クエリでJOINできますか?または、選択したものだけです。私はこのコードを持っているので、

$five_ago = date("Y-m-d H:i:s", strtotime("$now - 5 mins")); 

$sql_result23 = mysql_query("SELECT * FROM usersonline WHERE timestamp < '$five_ago'", $db); 
while ($rs23 = mysql_fetch_array($sql_result23)) { 
    mysql_query("UPDATE users SET status='gone' WHERE id ='$rs23[userID]'"); 
} 

それはusersonlineテーブルから5分以上経過したすべてのものを選び出し、そしてusersテーブルでそれらを検索し、そのレコードを更新。

私はJOINウィザードではありませんが、私は参加が単純化すると思います。 誰かがこれを明確にすることはできますか? JOIN使用

UPDATE users 
SET status='gone' 
WHERE id IN 
     (SELECT userID 
     FROM usersonline 
     WHERE timestamp < '$five_ago' 
    ) 

答えて

4

INを使用して

UPDATE users 
    JOIN usersonline 
    ON usersonline.userID = users.id 
SET users.status='gone' 
WHERE usersonline.timestamp < '$five_ago' 

EXISTS使用:

UPDATE users 
SET status='gone' 
WHERE EXISTS 
     (SELECT * 
     FROM usersonline 
     WHERE timestamp < '$five_ago' 
      AND userID = users.id 
    ) 

あなたはまた、をスキップすることができPHPでの計算とで、MySQLのエンジンは、その仕事をしてみましょう:

WHERE timestamp < NOW() - INTERVAL 5 MINUTE 
+0

Legitでは、さらに一歩進んで、mysqlレイヤーでタイムスタンプ差分を計算することもできます。 –

+0

+1理想的な解IMO –

2

はい、あなたはUPDATE文で参加することができますが、他の場所で示唆したように、私はより多くの構文を見つけるように私はおそらく、IN()サブクエリを使用しますMySQLの自分DATE_SUB()の使用も

UPDATE users 
    JOIN usersonline ON users.id = usersonline.userid 
    SET users.status='gone' 
WHERE usersonline.timestamp < DATE_SUB(NOW(), INTERVAL 5 MINUTE); 

注意ますので、事前にPHPでそれを処理する必要はありません。厄介以下JOINよりも単純明快。

0

このような意味ですか?

UPDATE users, usersonline 
SET users.status='gone' 
WHERE users.id ='$rs23[userID]' 
AND usersonline.timestamp < '$five_ago'; 

正常に動作するはずです。

0

コマンドINを紹介します。

例:

WHERE id IN(1,2,3,4,5,6) 

あなたがつもりここ何?最初。配列を作成します。

$five_ago = date('Y-m-d H:i:s', strtotime("$now - 5 mins")); 

$Array = array(); 

$sql_result23 = mysql_query('SELECT * FROM `usersonline` WHERE `timestamp` < "'.$five_ago.'"', $db); 
while ($rs23 = mysql_fetch_assoc($sql_result23)){ 
    $Array[] = $rs23['userID']; 
} 

mysql_query('UPDATE `users` SET `status`= "gone" WHERE `id` IN ('.join(',', $Array).')'); 
+0

PHPの '.join()'を使った2つのクエリは、 'JOIN'を使った1つのクエリより高速ですか?あなたはその主張のどこに基づいていますか? –

+0

Oups、申し訳ありません。あなたの権利私はここで非常に失われた笑!私は速く、各ユーザーのために更新を実行すると言う...私は私の心の中で失われたと言いたかった。 –

+1

ああ、大丈夫です。はい、あなたの方法は、元の 'while'ループ(n + 1クエリ)よりも高速です(わずか2クエリ)。 –