sql 根据多个 table 中的值更新 table 列
sql update table column based on values across multiple tables
我有 3 个 table(仅显示带有示例值的相关列):
请求
id website_id
=============
1 NULL
2 NULL
3 NULL
request_fields
id requests_id field_id field_response
=============================================
1 1 1 some site
2 1 2 some user
3 2 1 some other site
4 2 2 some other user
5 3 1 some site
6 3 2 rando user
网站
id website_name
===============
1 some site
2 some other site
我的目标是将 requests.website_id
更新为来自 websites.id
的值,但该值由 selecting 从 request_fields
确定,其中 requests.id=request_fields.requests_id
和
request_fields.field_id=1
和 request_fields.response=websites.website_name
所以 IOW,对于 requests
中的每一行,使用 requests.id
到 select request_fields.field_resonse
从 request_fields
其中 request_fields.request_id=requests.id
和 request_fields.field_id=1
然后 select websites.id
来自 websites
其中 websites.name=[the request_fields.field_resonse value]
然后将原始 requests.id
值设置为那个 websites.id
值。
所以最终结果将是
请求
id website_id
=============
1 1
2 2
3 1
这可以吗?我一直在努力思考它,我认为它涉及内部连接和其他东西,但这对我来说有点多。
编辑:
这是我目前的尝试,但我不确定我做对了吗?
update requests
inner join request_fields on requests.id=request_fields.request_id
inner join websites on request_fields.response=website.name
set requests.website_id=websites.id
我有点盯着 table 看,它似乎奏效了,但又一次..我有点头晕了,不确定我是否要搞砸我的东西真实 table.
您需要像这样在 UPDATE
语句中连接所有 3 个表:
UPDATE requests r
INNER JOIN request_fields rf ON rf.requests_id = r.id
INNER JOIN websites w ON w.website_name = rf.field_response
SET r.website_id = w.id
WHERE rf.field_id = 1;
参见demo。
我有 3 个 table(仅显示带有示例值的相关列):
请求
id website_id
=============
1 NULL
2 NULL
3 NULL
request_fields
id requests_id field_id field_response
=============================================
1 1 1 some site
2 1 2 some user
3 2 1 some other site
4 2 2 some other user
5 3 1 some site
6 3 2 rando user
网站
id website_name
===============
1 some site
2 some other site
我的目标是将 requests.website_id
更新为来自 websites.id
的值,但该值由 selecting 从 request_fields
确定,其中 requests.id=request_fields.requests_id
和
request_fields.field_id=1
和 request_fields.response=websites.website_name
所以 IOW,对于 requests
中的每一行,使用 requests.id
到 select request_fields.field_resonse
从 request_fields
其中 request_fields.request_id=requests.id
和 request_fields.field_id=1
然后 select websites.id
来自 websites
其中 websites.name=[the request_fields.field_resonse value]
然后将原始 requests.id
值设置为那个 websites.id
值。
所以最终结果将是
请求
id website_id
=============
1 1
2 2
3 1
这可以吗?我一直在努力思考它,我认为它涉及内部连接和其他东西,但这对我来说有点多。
编辑:
这是我目前的尝试,但我不确定我做对了吗?
update requests
inner join request_fields on requests.id=request_fields.request_id
inner join websites on request_fields.response=website.name
set requests.website_id=websites.id
我有点盯着 table 看,它似乎奏效了,但又一次..我有点头晕了,不确定我是否要搞砸我的东西真实 table.
您需要像这样在 UPDATE
语句中连接所有 3 个表:
UPDATE requests r
INNER JOIN request_fields rf ON rf.requests_id = r.id
INNER JOIN websites w ON w.website_name = rf.field_response
SET r.website_id = w.id
WHERE rf.field_id = 1;
参见demo。