php sql update join

use*_*882 6 php mysql join

刚学习sql连接和东西,我有一个问题.

你能加入更新查询吗?或者它仅适用于选择的那些.因为我有这个代码;

$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]'"); 
}
Run Code Online (Sandbox Code Playgroud)

它从usersonline表中挑选出超过5分钟的所有数据,然后在users表中找到它们并更新它们的记录.

我不是JOIN向导或任何东西,但我认为连接会简化这一点.有人可以澄清一下吗?

ype*_*eᵀᴹ 5

使用IN:

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

使用JOIN:

UPDATE users 
  JOIN usersonline 
    ON usersonline.userID = users.id
SET users.status='gone' 
WHERE usersonline.timestamp < '$five_ago'
Run Code Online (Sandbox Code Playgroud)

使用EXISTS:

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

你也可以跳过5 minutes agoPHP中的计算,让MySQL引擎做到这一点,用:

WHERE timestamp < NOW() - INTERVAL 5 MINUTE
Run Code Online (Sandbox Code Playgroud)