如何计算mysql中字符串的出现次数

时间:2016-02-29 10:28:50

标签: mysql regex count sum

我有一个包含以下列的数据库视图(viewAll):

Locus,varchar(10)
MismatchDesc,varchar(200)

此表格如下:

Locus MismatchDesc
HLA-A 435delA;553insG
HLA-B 665subA;776subA;998delG 
HLA-B 776subA;998delG
HLA-B 998delG
HLA-A 553insG

我需要使用其他列 MismatchCount 生成一个视图,使其看起来像:

Locus MismatchDesc MismatchCount
HLA-A 435delA;553insG 1
HLA-B 665subA;776subA;998delG 1 
HLA-B 776subA;998delG 1
HLA-B 998delG 3
HLA-A 553insG 2

目前我有:

CREATE VIEW mismatchCount AS SELECT Locus, MismatchDesc, SUM(IF('%'+MismatchDesc+'%',1,0)) AS MismatchCount FROM viewAll GROUP BY MismatchDescGDNA ORDER BY mismatchCount ASC;

我曾希望它会使用偷偷摸摸的通配符和sum函数生成我所需的输出,但事实并非如此,它只是以比我刚才使用的更复杂的方式生成输出' count'。

所以这当前产生输出:

Locus MismatchDesc MismatchCount
HLA-A 435delA;553insG 1 
HLA-B 665subA;776subA;998delG 1 
HLA-B 776subA;998delG 1
HLA-B 998delG 1
HLA-A 553insG 1 

在某处,必须有一种方法来计算每个字符串的出现次数,以及每个匹配字符串的实例?

我无法将字符串分开,因为我需要将每个唯一的字符串实例作为一个整体来计算。我希望这是有道理的。

修改

我不仅限于执行查询的方式,如果有更有效,更快捷的方式,请分享,因为这是处理大量数据,因此可能非常慢。

1 个答案:

答案 0 :(得分:1)

您可以使用相关查询来获取每个Locus的匹配计数,如下所示:

CREATE VIEW mismatchCount AS
SELECT s.Locus,
       s.MismatchDesc,
       (select count(*) from YourTable t
       WHERE t.MismatchDesc like concat('%',s.mismatchDesc,'%') as MismatchCount
FROM YourTable s

或者加入:

CREATE VIEW mismatchCount AS
SELECT s.Locus,
       s.MismatchDesc,
       count(case when t.MismatchDesc like concat('%',s.mismatchDesc,'%') then 1 end) as MismatchCount
FROM YourTable s
INNER JOIN YourTable t ON(1=1)
GROUP BY s.locus,s.mismatchDesc