如何在MySQL 8中循环结果集,同时更新表?

  • 本文关键字:更新 结果 MySQL 循环 mysql
  • 更新时间 :
  • 英文 :


我有

  • 表A: product_id和title
  • 的已知产品
  • 表B:带有标题和URL的抓取产品信息

我现在的目标是从表B中找到属于已找到产品的product_id,并将此product_id保存到表B中。

查找产品很容易通过全文搜索:

SELECT
mp.SKU
FROM
my_products mp
WHERE
MATCH (mp.NAME, mp.QUANTITY) AGAINST ('Some title I search for')
LIMIT 1

现在尝试遍历所有找到的产品:

SELECT TITLE, URL,(
SELECT
mp.SKU
FROM
my_products mp
WHERE
MATCH (mp.NAME, mp.QUANTITY) AGAINST (a.TITLE)
LIMIT 1
) SKU
from amazon_products a
where SKU is null

这显然不起作用,因为我不能引用外部表。更不用说更新表并将product_id添加到表b了。这是如何做到的?

从文档中可以看到

搜索字符串必须是在查询求值时保持不变的字符串值。

这就是为什么你的查询不会工作,与子查询无关。

只有LIKE或REGEXP表达式可以处理这个

使用动态sql的存储过程也可以处理这个问题。但是循环遍历所有的可能性要花很长时间

您可以尝试下面的更新语句。

推荐

MATCH-AGINST需要against中的文字值,因此在这里使用类似的函数可能更理想。遍历结果集并每次查询另一个表可能会很昂贵。下面我使用了带有通配符匹配的LIKE来在更新函数中实现这一点。

Schema (MySQL v8.0)
create table amazon_products (
product_id int,
title varchar(20),
FULLTEXT KEY (title)
);
create table my_products (
product_id int,
NAME text,
QUANTITY varchar(20) default 'some',
FULLTEXT(NAME, QUANTITY)
);
insert into my_products (product_id,name) values (1,'cardboard'),(2,'tes');
insert into amazon_products values (1,'cars'),(NULL,'test');

查询# 1

select * from amazon_products;
<表类>product_id标题tbody><<tr>1汽车测试

最新更新