Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL函数获取字符串在列中出现的次数?_Sql_Mysql_Search_Function_Text - Fatal编程技术网

SQL函数获取字符串在列中出现的次数?

SQL函数获取字符串在列中出现的次数?,sql,mysql,search,function,text,Sql,Mysql,Search,Function,Text,MySQL是否有一个函数可以计算一个字符串在另一个字符串或列中出现的次数?基本上我想要: SELECT SUB_COUNT('my word', `my_column`) AS `match_count` FROM `table` 谢谢 编辑: 我需要知道该字符串在SELECT中每行的列中出现的次数。取决于您所说的字符串出现的含义-作为子字符串还是作为完整值 全值案例: SELECT COUNT(*) FROM my_table WHERE my_column = 'my word';

MySQL是否有一个函数可以计算一个字符串在另一个字符串或列中出现的次数?基本上我想要:

SELECT
    SUB_COUNT('my word', `my_column`) AS `match_count`
FROM `table`
谢谢

编辑:
我需要知道该字符串在SELECT中每行的列中出现的次数。

取决于您所说的字符串出现的含义-作为子字符串还是作为完整值

全值案例:

SELECT COUNT(*) FROM my_table WHERE my_column = 'my word';
子字符串情况:

SELECT COUNT(*) FROM my_table WHERE my_column LIKE '%my word%';

一个明显但不可扩展的方法是这样的

(LENGTH(`my_column`) - LENGTH(REPLACE(`my_column`, 'my word', '')))/LENGTH('my word')

您研究过MySQL中的搜索吗?

我认为您可以使用以下示例。我试着数一数某一纸箱在装运时被使用的次数

SELECT carton_type, COUNT(carton_type) AS match_count
FROM carton_hdr
WHERE whse ='wh1'
GROUP BY "carton_type"
您的场景:

SELECT my_column COUNT(my_column)
FROM my_table
WHERE my_column = 'my_word'
GROUP BY my_column

如果去掉where函数,它将计算每个不同条目在my_列中出现的次数。

我只需要做一些类似的事情,但采取了不同的方法。我将相关字符串复制到一个临时表中,在该临时表中,我可以添加列来跟踪每行上每个事件的索引

在我的例子中,我在产品描述中寻找子字符串-空格-破折号空格,目的是最终将它们分开显示为项目符号点,我正在分析这样的数据,以查看产品通常有多少项目符号

我怀疑这比反复重写字符串值更有效,但实际上我还没有进行基准测试

SELECT 
        ccp.ProductID, p.ProductDescription, descrlen=LEN(p.ProductDescription), 
        bulletcnt=0, indx=0, lastmatchat=0
    INTO #DescrBullets
    FROM Private.CompositeCatalogProduct AS ccp WITH(NOLOCK) 
    INNER JOIN Products.Product AS p WITH(NOLOCK) ON p.ProductId = ccp.ProductID
    WHERE ccp.CompositeCatalogID=53


DECLARE @rows INT = 1
WHILE @rows>0
BEGIN 

-- find the next occurrence on each row that's still in play
UPDATE #DescrBullets
    SET lastmatchat = PATINDEX('% - %',RIGHT(ProductDescription,descrlen-indx))
    WHERE indx<descrlen

-- anywhere that a match was found, increment my counter, and move my
-- index "cursor" past it
UPDATE #DescrBullets
    SET bulletcnt = bulletcnt + 1,
        indx = indx + lastmatchat + 2
    WHERE lastmatchat>0
SET @rows = @@ROWCOUNT

-- for all the ones that didn't have a match, advance indx past the end
-- so we don't need to reprocess on next iterations
UPDATE #DescrBullets
    SET indx=descrlen
    WHERE lastmatchat=0

RAISERROR('processing, %d products still have bullets', 0, 1, @rows) WITH NOWAIT

END 

SELECT db.bulletcnt, occurs=COUNT(*)
    FROM #DescrBullets AS db
    GROUP BY db.bulletcnt
    ORDER BY 1

您是要计算字符串出现在字段中的记录,还是要计算字符串出现在每个记录的字段中的次数?但最好只使用ID列或类似的列,这样可以减少要检索的数据量,尤其是只进行计数it@abatishchev-COUNT*不检索所有数据,然后对其进行计数@马丁:谢谢!马丁:我现在知道了。所以我想不出到底要数到哪一列,每次都要用count*?这个答案不相关。我想计算字符串作为子字符串出现的次数,如我的问题所示。我不想把所有的行都算作你的答案。我使用的是全文搜索w/MySQL,但我在做一些相关排序。您的解决方案很好,因为我可以在订购时避免分歧。