1

我有两张桌子:

第一表:

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

第二表:

code    stores
1000002 Store1,Store3

我想要做的是更新FirstTable.sent以获取特定代码,仅针对SecondTable.stores中存在的记录

我有一个过程,它接受一个字符串和一个分隔符并从字符串构建一个结果集。例如,如果我拨打以下电话:

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 中调用存储过程。

我认为一个函数也不能满足我的需求,因为它不能返回表或结果集。有没有办法在不改变设计的情况下做我需要的事情?

4

2 回答 2

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 上有很多关于加入逗号分隔字符串的问题。我找不到提到 UPDATE 查询的问题,否则我会投票决定将您的问题作为重复项关闭。

更好的答案是当您知道需要在 SQL 条件中引用该列表中的各个条目时,避免存储逗号分隔的字符串。请参阅我对在数据库列中存储分隔列表真的那么糟糕吗?

于 2017-10-23T14:29:12.633 回答
0

你能做到吗:

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
于 2017-10-23T14:25:09.030 回答