PHP SQL 更新联接(Join)

6

我正在学习SQL连接等技术,有一个问题想问。

在更新查询中是否可以使用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可以简化这个过程。有人能解释一下吗?

4个回答

8

使用 IN

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

使用 JOIN:
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中,您也可以跳过5分钟前的计算,让MySQL引擎完成此工作:

WHERE timestamp < NOW() - INTERVAL 5 MINUTE

你甚至可以更进一步,在mysql层面计算时间戳差。 - Mike Purcell

2

是的,你可以在 UPDATE 语句中使用 JOIN,但我建议像其他地方建议的那样使用 IN () 子查询,因为我发现语法比下面的笨拙的 JOIN 更直观:

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

注意使用MySQL自带的DATE_SUB()函数,这样您就不必在PHP中预处理。详情请见MySQL官网

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).')'); 

那么,使用 PHP 的 .join() 连接两个查询比使用一个 JOIN 查询更快吗?你的这种说法基于什么依据? - ypercubeᵀᴹ
哎呀,不好意思。你说得对,我在这里非常迷茫哈哈!我想说的是,相比为每个用户运行UPDATE语句,这种方法会更快...我在自己的思维中迷失了。 - David Bélanger
1
啊,好的。是的,你的方法仍然比原始的“while”循环(n+1个查询)更快(只有2个查询)。 - ypercubeᵀᴹ
是的,就是这样。抱歉。但我不知道有UPDATE join,我会更新我的一些查询:P 你今天教了我一些新东西。 - David Bélanger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接