【问题标题】:SQL function to get count of how many times string appears in column?SQL函数来计算字符串在列中出现的次数?
【发布时间】:2011-03-03 04:06:30
【问题描述】:

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

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

谢谢!

编辑: 我需要知道SELECT 中每一行的字符串在一列中出现了多少次。

【问题讨论】:

  • 是要统计某个字段中字符串出现的记录,还是要统计每条记录中某个字段出现字符串的次数?

标签: sql mysql search function text


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    我认为您可以使用以下示例。我试图计算运输时使用特定纸箱类型的次数。

    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_column”中的次数。

    【讨论】:

      【解决方案3】:

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

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

      您是否调查过 MySQL 中的 Full Text 搜索?

      【讨论】:

      • 我正在使用带 MySQL 的全文搜索,但我正在做一些相关性排序。您的解决方案很棒,因为我可以在订购时避免分歧。
      【解决方案4】:

      取决于您所说的“字符串出现”是什么意思——作为子字符串还是作为完整值?

      全值案例:

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

      子字符串大小写:

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

      【讨论】:

      • 但也许最好只使用ID 列(或类似的)确实减少了要检索的数据量,尤其是你只计算它
      • @abatishchev - COUNT() *不检索所有数据然后计算它!
      • @Martin:谢谢!现在就知道了。
      • @Martin:所以我想不出具体要计算哪一列,每次都使用COUNT(*)
      • 这个答案不相关。如我的问题所示,我正在计算字符串作为子字符串出现的次数。我不想将所有行都算作您的答案建议。
      猜你喜欢
      • 2017-09-29
      • 1970-01-01
      • 2020-12-10
      • 2022-01-06
      • 2022-01-17
      • 2014-04-24
      • 2019-06-03
      • 1970-01-01
      相关资源
      最近更新 更多