Mysql 用另一列中的子字符串数填充列

Mysql 用另一列中的子字符串数填充列,mysql,Mysql,我有两张A桌和B桌。表“A”有两列“正文”和“编号”。列“编号”为空,目的是填充它 表A:主体/数量 ABABCDEF / IJKLMNOP / QRSTUVWKYZ / 表“B”只有一列: 表B:价值 AB CD QR 以下是我所寻找的结果: ABABCDEF / 3 IJKLMNOP / 0 QRSTUVWKYZ / 1 换句话说,我想创建一个查询,为“Body”列中的每个字符串查找“Values”列中的子字符串出现的次数 你建议我怎么做?这是完成的查询;解释如下: SELECT

我有两张A桌和B桌。表“A”有两列“正文”和“编号”。列“编号”为空,目的是填充它

表A:主体/数量

ABABCDEF /
IJKLMNOP /
QRSTUVWKYZ /
表“B”只有一列:

表B:价值

AB
CD
QR
以下是我所寻找的结果:

ABABCDEF / 3
IJKLMNOP / 0
QRSTUVWKYZ / 1
换句话说,我想创建一个查询,为“Body”列中的每个字符串查找“Values”列中的子字符串出现的次数


你建议我怎么做?

这是完成的查询;解释如下:

SELECT
  Body,
  SUM(
    CASE WHEN Value IS NULL THEN 0
         ELSE (LENGTH(Body) - LENGTH(REPLACE(Body, Value, ''))) / LENGTH(Value)
         END
  ) AS Val
FROM (
    SELECT TableA.Body, TableB.Value
    FROM TableA
    LEFT JOIN TableB ON INSTR(TableA.Body, TableB.Value) > 0
  ) CharMatch
GROUP BY Body
有一个SQL小提琴

现在来解释一下

内部查询将
TableA
字符串与
TableB
子字符串匹配:

SELECT TableA.Body, TableB.Value
FROM TableA
LEFT JOIN TableB ON INSTR(TableA.Body, TableB.Value) > 0
其结果是:

BODY                 VALUE
-------------------- -----
ABABCDEF             AB
ABABCDEF             CD
IJKLMNOP
QRSTUVWKYZ           QR
如果只计算这些值,则
ABABCDEF
字符串的值将仅为2,因为它只查找子字符串的存在,而没有考虑到
AB
出现两次

MySQL似乎没有
OCCURS
type函数,因此为了计算出现的次数,我使用了一种变通方法,将字符串的长度与其删除的目标字符串的长度进行比较,除以目标字符串的长度。这里有一个解释:

  • REPLACE('ABABCDEF','AB','')==>CDEF'
  • LENGTH('ABABCDEF')
    ==>8
  • LENGTH('CDEF')
    ==>4
因此,删除所有
AB
引用的字符串长度为8-4,或4。将4除以2(
LENGTH('AB')
)得到
AB
出现次数:2


字符串
IJKLMNOP
会把事情搞砸。它没有任何目标值,因此存在除以零的风险。
SUM
中的
案例
可防止出现这种情况。

您需要
更新
查询:

update A
    set cnt = (select sum((length(a.body) - length(replace(a.body, b.value, '')) / length(b.value))
               from b
              )
这使用了一个小技巧来计算给定字符串中
b.value
的出现次数。它用空字符串替换每个匹配项,并计算字符串长度的差异。这除以被替换字符串的长度

如果您只是想要匹配的数量(因此第一个值应该是“2”而不是“3”):


通过使用MySQL以外的语言编写函数。不能用纯SQL解决。试一试,遇到问题时再来。我不是程序员,但我想说这不是一个坏主意。你可以找出身体中是否有一个有价值的东西,但我不知道如何找出它有多少次
update A
    set cnt = (select count(*)
               from b
               where a.body like concat('%', b.value, '%')
              )