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.B集合X.C=Z.A上的X内部联接Z 让我们从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
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