Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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,我觉得这个查询很容易构造,我就是搞不懂 我想用表Z列A中的数字替换表X列C中的所有数字,其中表X列C中的数字与表Z列B中的数字匹配 我希望这是有道理的。也许一点背景资料会让它更清楚。我已经从一个CMS转换到另一个CMS,我用来转换的模块将ID映射到新的数据库。表X列A是新id的。表X B列是旧id。 表Z是我迁移的图像库的表,C列包含图像所有者的id 有人能拧下这个螺母吗?试试这个: UPDATE X SET C=Z.A FROM Z WHERE X.C = Z.B 更新X.C

我觉得这个查询很容易构造,我就是搞不懂

我想用表Z列A中的数字替换表X列C中的所有数字,其中表X列C中的数字与表Z列B中的数字匹配

我希望这是有道理的。也许一点背景资料会让它更清楚。我已经从一个CMS转换到另一个CMS,我用来转换的模块将ID映射到新的数据库。表X列A是新id的。表X B列是旧id。 表Z是我迁移的图像库的表,C列包含图像所有者的id

有人能拧下这个螺母吗?

试试这个:

UPDATE X SET C=Z.A FROM Z WHERE X.C = Z.B 更新X.C=Z.B集合X.C=Z.A上的X内部联接Z

让我们从

X.foo X.C
  A    1
  B    2

合并表会导致

X.foo X.C Z.B Z.A
  A    1   1   2
  B    2   2   3
更新会获取每一行,并将X.C中的值替换为同一行中Z.A中的值,从而导致:

X.foo X.C
  A    2
  B    3
如果Z.B不是唯一的,您可能会得到不想要的结果


编辑:这只是一个例子。仔细选择联接-例如,您可能喜欢也可能不喜欢左联接。考虑一下X.C获取Z.B中不存在的值的情况,并确定是希望X.C保持不变还是设置为NULL。

仅为了完整性,第一个答案语法错误是由于FROM引起的。更新语法不需要来自,因为更新定义了所有表和联接,而集合实际上定义了要更新的内容。就直接语义而言,它有点落后,不像SELECT那么好。。。从…起听起来像自然语言。例如,你会说

UPDATE X, Z
SET    X.C = Z.A 
WHERE  X.C = Z.B
即使您根本不会更新表Z,但您会习惯它。好的方面是,您可以像在选择查询中编写FROM部分一样编写更新部分-因此它可以像您需要的那样复杂,并且仍然可以很容易地将选择查询转换为更新查询使用SELECT预览您的更新查询集,这是对实时数据的任何特殊查询的一种良好做法。 要从更新查询转到选择,只需将更新替换为from,用SELECT设置,在SELECT部分用逗号等号,当然要将SELECT放在顶部

SELECT X.C, Z.A
FROM   X, Z
WHERE  X.C = Z.B
将为您提供将执行的操作的预览,列出字段的旧值和将分配给它的新值


Mysql有不错的性能。您可能更喜欢向后阅读—首先是结尾的示例,然后是完整的参考定义。通常你会在文章下面找到一些非常有用的评论。

我用Titanobas第一条评论解决了这个问题,运行了以下查询:

更新X 在Z.A=X.C上左连接Z 设定X.C=Z.A 其中X.C=Z.B

现在我明白了,您建议我不要使用LEFT-JOIN,但幸运的是它按预期工作。 然后我尝试了戈兰斯的例子,效果也很好。戈兰的例子更容易理解,尽管这对我来说是一个很好的教训


谢谢你的帮助

谢谢你的回答。我能看出其中的逻辑。但是我在与FROM的行中得到一个语法错误。这是我运行的查询:更新joomgallery SET owner=joomla_users.uid FROM joomla_users其中joomgallery.owner=drupal_joomla_users.juid,我看不出有什么问题。1064-您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解第3行“FROM drupal_joomla_users,其中jos_joomgallery.owner=drupal_joomla_users”附近使用的正确语法。我正在运行mysql 5.1.33,这可能是个问题吗?iirc更新没有FROM,这就是为什么会出现这个语法错误。省略Z以消除此错误。但是如果这样的话,结果查询也不会起作用——为了使用多个表,您需要进行适当的联接。事实上,Goran也提出了联接,因为逗号分隔的表列表实际上是交叉联接。在你的例子中,Goran的例子和我提出的内部连接应该会给出相同的结果。另外,使用左连接也没有什么错,我无意阻止您使用它。这与内部连接完全不同。谢谢。如果你觉得答案有用,你也可以这样做:
SELECT X.C, Z.A
FROM   X, Z
WHERE  X.C = Z.B