在逗号分隔的字段中更新一个 table 中存在于另一个 table 中的寄存器的记录

Update records in one table for register present in another table, in a comma separated field

我有两个 table:

第一个表:

code    store  sent
1000002 Store1 0 
1000002 Store2 0
1000002 Store3 0

第二张表:

code    stores
1000002 Store1,Store3

我想做的是为特定代码更新 FirstTable.sent,仅针对 SecondTable.stores[ 中存在的记录=37=]

我有一个过程,它接受一个字符串和一个分隔符并从该字符串构建一个结果集。 例如,如果我进行以下调用:

call sp_csv_as_resultset("A,B,C,D", ",");

我得到以下输出作为结果集:

A
B
C
D

我在下一个更新语句中做了那个程序,目的是实现我需要的:

update FirstTable ft
inner join et_sap_magento_store_ids_removals_IF st
on ft.code = st.code
set ft.sent = 1
and ft.sent = 0
and ft.store in (sp_csv_as_resultset(st.stores, ','));

但是如您所知,您不能在 select.

中调用存储过程

我认为一个函数不能满足我的需求,因为它不能 return 一个 table 或一个结果集。有没有一种方法可以在不更改设计的情况下满足我的需求?

你能做到吗:

UPDATE first_table ft
INNER JOIN second_table st
ON ft.code=st.code
AND st.store LIKE CONCAT('%', ft.store ,'%')
SET ft.sent = 1

MySQL 有一个名为 FIND_IN_SET() 的函数可以提供帮助。

UPDATE FirstTable AS f
JOIN SecondTable AS s
  ON f.code = s.code AND FIND_IN_SET(f.store, stores)
SET f.sent =1
WHERE f.sent = 0;

但是,请注意 FIND_IN_SET() 不能使用索引。在你的情况下,至少连接可以在 code 上使用索引,但在这些匹配中它必须以困难的方式进行扫描。

Stack Overflow 上有很多关于连接逗号分隔字符串的问题。我找不到提到更新查询的问题,否则我会投票决定将您的问题作为重复问题关闭。

当您知道需要在 SQL 条件下引用该列表中的单个条目时,更好的答案是避免存储逗号分隔的字符串。请参阅我对 Is storing a delimited list in a database column really that bad?

的回答