Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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,我有一张包含帖子和评论的平面表格。目前,帖子和评论之间并没有真正的联系,我只知道,评论就在它们相应的帖子之前(就id列而言) 改进的第一步是创建“commentforid”列并适当填充: UPDATE mytable t SET t.commentforid = (SELECT x.id FROM mytable x WHERE x.origin = 'POST'

我有一张包含帖子和评论的平面表格。目前,帖子和评论之间并没有真正的联系,我只知道,评论就在它们相应的帖子之前(就id列而言)

改进的第一步是创建“commentforid”列并适当填充:

UPDATE mytable t
SET t.commentforid = (SELECT x.id
                      FROM mytable x
                      WHERE x.origin = 'POST'
                      AND x.id > t.id
                      LIMIT 1)
WHERE t.origin = 'COMMENT'
但是,查询失败

无法在FROM子句中为update指定目标表“t”


有人知道问题出在哪里吗?我无法从错误消息中看出任何信息。

此错误与您正在更新所选的同一个表有关。您可以使用临时表覆盖此情况

试着用桌上的迪那米克

  UPDATE mytable t
  SET t.commentforid = (SELECT x.id

                        FROM ( select z.id from mytable z
                        WHERE x.origin = 'POST' ) x on  x.id > t.id
                        LIMIT 1)
  WHERE t.origin = 'COMMENT'

该错误与您正在更新所选的同一个表有关。您可以使用临时表覆盖这种情况

试着用桌上的迪那米克

  UPDATE mytable t
  SET t.commentforid = (SELECT x.id

                        FROM ( select z.id from mytable z
                        WHERE x.origin = 'POST' ) x on  x.id > t.id
                        LIMIT 1)
  WHERE t.origin = 'COMMENT'

错误信息非常清楚。它告诉您无法从正在更新的同一个表中获取新值

为什么?


假设(即使是错误的)您正试图使用相同的记录和字段值更新记录中的字段。这对您有意义吗?

错误信息非常清楚。它告诉您无法从正在更新的同一个表中获取新值

为什么?


假设(即使是错误的)您正试图使用相同的记录和字段值更新记录中的字段。这对您有意义吗?

感谢您澄清了根本问题,@scaisEdge提供了一个解决方案。另一种方法是(这是我喜欢的方式,因为它使代码更易于阅读和理解):在单个select语句中获取字段的新值(这将是内部select),然后在update语句中使用检索到的值(外部选择)。是的,我知道,有些人可能不同意,但软件工程的黄金法则之一(不幸被许多人遗忘或不知道)是,你不为自己编写代码,而是为其他可能需要阅读和理解代码的人编写代码。感谢你澄清了根本问题,@scaisEdge提供了一个解决方法。另一种方法是(这是我更喜欢的方式,因为它使代码更易于阅读和理解):在单个select语句(即内部select)中获取字段的新值,然后在update语句(您的外部select)中使用检索到的值。是的,我知道,有些人会不同意,但这是软件工程的黄金规则之一(不幸被许多人遗忘或不知道)是您不为自己编写代码,而是为其他可能需要阅读和理解代码的人编写代码。在能够这样做之前,您至少需要等待几分钟。@DR.Thank.。我没有在评论中查看时间。。无论如何,非常感谢您在能够这样做之前,您至少需要等待几分钟。@DR.Thank…我没有在评论中看时间…无论如何,非常感谢