如何通过将一个表中的 id 与另一个表匹配来选择和更新一个表中的记录?

Posted

技术标签:

【中文标题】如何通过将一个表中的 id 与另一个表匹配来选择和更新一个表中的记录?【英文标题】:How to select and update records in one table by matching ids from it with another table? 【发布时间】:2015-10-02 03:35:25 【问题描述】:

我正在使用 MySQL 和 phpMyAdmin

我是数据库、RDBMS、SQL 查询和所有这些东西的新手。

我有一个名为 user 的数据库表,其中包含以下字段:

user_id(primary key) Data type : int(10) 
user_group_id Data type : smallint(4)

我有另一个名为 user_field 的数据库表,其中包含以下字段:

user_id(primary key) Data type : int(10) 
country_child_id Data type : mediumint(8) 

现在我想为上面的表选择查询和更新查询。

在选择查询中,它应该返回表 user_field 的结果,其中 user_group_id = 6 and user.user_id = user_field.user_id

在更新查询中,我想从表user_field 更新country_child 字段(country_child = 1398),其中user_group_id = 6 and user.user_id = user_field.user_id

有人可以帮我构建查询吗?

谢谢。

【问题讨论】:

【参考方案1】:

尝试使用 INNER JOIN 获取要更新的记录。你可以试试这个查询:

UPDATE a
SET a.country_child_id = 1398
FROM user_field AS a
INNER JOIN user AS b ON a.user_id = b.user_id
WHERE b.user_group_id = 6

希望对你有帮助。

编辑:

对于 mysql

UPDATE user_field
INNER JOIN user ON user.user_id = user_field.user_id
SET user_field.country_child_id = 1398
WHERE user.user_group_id = 6

很抱歉,第一个更新语句只能在 MSSQL 中使用。 @Kendal 是对的,在 MySQL 的 SET 子句中,在 INNER JOIN 之后。

【讨论】:

【参考方案2】:

我建议为此类更新使用where exists 子句,例如:http://sqlfiddle.com/#!9/0852a/1

update user_field
set country_child_id = 1398
where exists (
  select * from user
  where user.user_id = user_field.user_id
  and user.user_group_id = 6
)

在示例小提琴中,您会注意到两条记录已更新——user_id = 2user_id = 6 都是 user_group_id = 6 的一部分。

编辑:

我应该提到我喜欢这种语法,因为我发现它易于阅读,尽管我可能还应该提到您可以使用更明确的inner join。请记住,mySQL 的语法似乎与其他语法略有不同,因为 join 子句位于 set 子句之前。

至少,我是这样让它工作的:http://sqlfiddle.com/#!9/de73e/1

update user_field
inner join user
on user.user_id = user_field.user_id
set country_child_id = 1398
where user.user_group_id = 6

两个都试一下,让我知道哪个更快。干杯!

【讨论】:

以上是关于如何通过将一个表中的 id 与另一个表匹配来选择和更新一个表中的记录?的主要内容,如果未能解决你的问题,请参考以下文章

从一个表中选择所有元素,并检查它们是不是与另一个表匹配

当存在 NULL 时,性能选择与另一个表中的条目不匹配的行

如何将同一表中的一条记录与另一条记录关联?

如果任何列与另一个表中的匹配行不同,如何插入行

如何根据与另一个表中的值的比较来更新列

从与另一个表中的条件匹配的表中删除