MySQL 是否有一个函数可以计算一个字符串在另一个字符串或列中出现的次数?基本上我想要:
SELECT
SUB_COUNT('my word', `my_column`) AS `match_count`
FROM `table`
谢谢!
编辑: 我需要知道该字符串在
SELECT
中每行的列中出现了多少次。
一个明显但不可扩展的方式是这样的
(LENGTH(`my_column`) - LENGTH(REPLACE(`my_column`, 'my word', '')))/LENGTH('my word')
您研究过 MySQL 中的全文搜索吗?
我只需要做类似的事情,但采取了不同的方法。我将相关字符串复制到临时表中,在其中我可以添加列来跟踪每行中每次出现的索引。
在我的示例中,我正在产品描述中查找子字符串“ - ”(空格-破折号-空格),目的是最终将它们分开以显示为要点,并且我正在分析这样的数据以查看产品通常有多少“子弹”。
我怀疑这比反复重写字符串值更有效,但我实际上还没有进行基准测试。
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
如果您想计算列中字符串的出现次数,可以使用
IF
来完成此操作。
SELECT SUM(IF(column_name, 'desired_value', 0))
FROM table_name
我想你也许可以使用下面的例子。我试图计算运输时使用特定纸箱类型的次数。
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”中的次数。