Php MySQL为什么这些查询的顺序会改变结果?

Php MySQL为什么这些查询的顺序会改变结果?,php,mysql,mysqli,Php,Mysql,Mysqli,我有两个MySQL表,一个是datetake,另一个是lastReview,都用过去的值存储日期时间。这两个表都有一个UserID列(不是索引唯一的)。我有一些查询,这些查询的目的是将绑定到特定用户的所有日期前移,以使最大值为立即。以下是我的疑问: // Step 1: calculate and store the offset SELECT @offset := DATEDIFF( CURDATE(), (SELECT MAX(r.LastReviewed) FROM

我有两个MySQL表,一个是
datetake
,另一个是
lastReview
,都用过去的值存储日期时间。这两个表都有一个
UserID
列(不是索引唯一的)。我有一些查询,这些查询的目的是将绑定到特定用户的所有日期前移,以使最大值为立即。以下是我的疑问:

// Step 1: calculate and store the offset
SELECT @offset := DATEDIFF(
   CURDATE(),
   (SELECT MAX(r.LastReviewed) 
    FROM `results` r WHERE r.`UserID`= 123     
)

// step 2: shift dates in drills table by the offset
UPDATE `drills` d
SET d.`DateTaken` = d.`DateTaken` + INTERVAL @offset DAY
WHERE d.`UserID`=123

// step 3: shift dates in results table by the offset
UPDATE `results` 
   SET LastReviewed = LastReviewed + INTERVAL @offset DAY
 WHERE UserID = 123
我使用PHP的。比如:

$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$mysqli->multi_query("$step1; $step2; $step3");
发生了一些非常奇怪的事情,但我不明白为什么。如果我按照上面的顺序运行查询,两个表都会正确更新。但是,如果我交换步骤2和步骤3:

$mysqli->multi_query("$step1; $step3; $step2");

然后,
drills
表(步骤2)不会更新,
结果
表(步骤3)会更新。为什么会这样?对我来说似乎不合逻辑,因为步骤2和步骤3是独立的。

似乎
@offset
定义没有计算实际值,但仍然是语句。如果您随后更改
结果
,它也将更改
@offset
@colburton,这将解释它!但这对绩效有很大影响;这意味着每次使用
@offset
时都会运行第一个
选择
,而我的目的是存储该值。如果你想写一个完整的答案,并附上支持文档的链接,我会选择它。如果你知道如何实际存储一个值,我很乐意听到。不幸的是,这只是一个猜测。我没有找到关于这种行为的任何文档。性能影响不会太大,因为优化器肯定只会让该部分在每个查询中运行一次。因此,在您的示例中,它只运行两次而不是一次。值得研究的可能还有将所有查询放在一个事务中。这并不能解释其行为,但我会将第一条语句写成
SET@offset:=selectdatediff(…)
selectdatediff(…)into@offset
@PaulSpiegel,感谢我不知道这两种语法。你为什么要用其中一个呢?我假设是这样,值本身将存储在
@offset