Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中选择某些记录后更新_Mysql - Fatal编程技术网

在MySQL中选择某些记录后更新

在MySQL中选择某些记录后更新,mysql,Mysql,在我的客户表中,ref是自动增量,ID是客户标识号。因此,每个客户都有多个ID,这些ID构成了每个客户的历史记录。我想通过在所有情况下将“可能性”字段设置为1来更新每个客户的最新记录,但不创建新记录 我认为这样的查询就可以了: 更新客户集可能性=1,其中customer.ref位于 按ID从客户组中选择MAXref 但我得到了以下错误: 1093-无法在FROM子句中为更新指定目标表“customer” 我哪里做错了 编辑: 有些示例数据不是完整的表 ref | ID | likelihood

在我的客户表中,ref是自动增量,ID是客户标识号。因此,每个客户都有多个ID,这些ID构成了每个客户的历史记录。我想通过在所有情况下将“可能性”字段设置为1来更新每个客户的最新记录,但不创建新记录

我认为这样的查询就可以了:

更新客户集可能性=1,其中customer.ref位于 按ID从客户组中选择MAXref

但我得到了以下错误:

1093-无法在FROM子句中为更新指定目标表“customer”

我哪里做错了

编辑: 有些示例数据不是完整的表

ref | ID | likelihood | name
----+----+------------+-----
  1 |  1 |          0 | a
  2 |  2 |          0 | b
  3 |  1 |          0 | a
  4 |  2 |          0 | b
  5 |  1 |          0 | a
  6 |  1 |          0 | a
所以我想挑出:

  4 |  2 |          0 | b
  6 |  1 |          0 | a
并将其更改为:

  4 |  2 |          1 | b
  6 |  1 |          1 | a

由于无法更新从中选择的表,因此出现错误。您正在编写的where子句正在从customers表中进行选择,因此无法在更新中写入该子句

您可能需要两个查询来完成此操作,例如:

SELECT @max_ref:=max(ref) FROM customers;
UPDATE customers SET likelihood=1 WHERE ref=@max_ref

由于无法更新从中选择的表,因此出现错误。您正在编写的where子句正在从customers表中进行选择,因此无法在更新中写入该子句

您可能需要两个查询来完成此操作,例如:

SELECT @max_ref:=max(ref) FROM customers;
UPDATE customers SET likelihood=1 WHERE ref=@max_ref

我不记得它是否允许在更新中进行自加入。试试这个-

UPDATE customer c1
LEFT JOIN customer c2
    ON c1.ID = c2.ID
    AND c1.ref < c2.ref
SET c1.likelihood = 1
WHERE c2.ID IS NULL

编辑我已将第二个联接条件中使用的列从ID更改为ref。

我记不起它是否允许在更新中进行自联接。试试这个-

UPDATE customer c1
LEFT JOIN customer c2
    ON c1.ID = c2.ID
    AND c1.ref < c2.ref
SET c1.likelihood = 1
WHERE c2.ID IS NULL


编辑我已将第二个连接条件中使用的列从ID更改为ref。

您可以发布一些示例数据吗……您粘贴的错误是否准确?当查询在表“customer”上时,错误引用了表“clients”。@kclair right message,error table-Edit,Thank Scan post一些示例数据…您粘贴的错误是否准确?当查询在表“customer”上时,错误引用了表“clients”。@kclair right message,error table-edited,thanksThanks,但是MySQL返回了一个空的结果集,即零行。我不知道它如何知道为每个客户选择最新的ID?哦,很抱歉,我错过了它必须更新每个客户的部分,所以查询没有真正做到你需要它做的事,我的错是没有彻底阅读问题,同时我非常感谢jchong的帮助,正如jchong所说的,这并不能满足要求——所以我不知道为什么它会被提升?谢谢,但是MySQL返回了一个空的结果集,即零行。我不知道它如何知道为每个客户选择最新的ID?哦,很抱歉,我错过了它必须更新每个客户的部分,所以查询没有真正做到你需要它做的事,我的错是没有彻底阅读问题,同时我非常感谢jchong的帮助,正如jchong所说,这并不能满足要求——所以我不知道为什么它被提升了投票率?谢谢,加入看起来像是答案,但这个查询改变了不是1比1的所有可能性。我很抱歉。我不确定在连接的第二个条件中如何使用ID而不是ref。它现在应该可以工作了。这个工作很好,非常感谢你帮我解决这个问题。谢谢,加入看起来像是答案,但这个查询很可能会改变,不是1比1。我很抱歉。我不确定在连接的第二个条件中如何使用ID而不是ref。现在应该能用了。这工作做得很好,非常感谢你帮我解决这个问题。