Mysql 如何获取大表中匹配字符串的计数
我有一个具有以下结构的表:Mysql 如何获取大表中匹配字符串的计数,mysql,sql,string,count,Mysql,Sql,String,Count,我有一个具有以下结构的表: +-----+-------------------+ | ID | Name | +-----+-------------------+ | 1 | abc | +-----+-------------------+ | 2 | abc (duplicate) | +-----+-------------------+ | 3 | bcd | +-----+-----
+-----+-------------------+
| ID | Name |
+-----+-------------------+
| 1 | abc |
+-----+-------------------+
| 2 | abc (duplicate) |
+-----+-------------------+
| 3 | bcd |
+-----+-------------------+
| 4 | bcd (duplicate) |
+-----+-------------------+
| 5 | bcd (duplicate) |
+-----+-------------------+
| 6 | efg |
+-----+-------------------+
| 7 | hij |
+-----+-------------------+
我需要计算每个名称
发生的次数(包括(重复)
),即:
我想提到的是,Name
列实际上具有类型TINYTEXT
。其中会有很多行:5396已经处于测试模式。我试图通过TRIM(用分组替换(名称,“(重复)”)
来实现表的自连接:
SELECT
DISTINCT TRIM(REPLACE(`t`.`Name`, '(duplicate)', '')) as `name`,
COUNT(`s`.`ID`) as `count`
FROM
`Table` as `t` INNER JOIN `Table` as `s` ON
TRIM(REPLACE(`t`.`Name`, '(duplicate)', '')) LIKE TRIM(REPLACE(`s`.`Name`, '(duplicate)', ''))
GROUP BY 1;
而且。。。好吧,花了122.62秒,在我的开发机器上得到了4846行的结果
Q1:这是正确的方法吗 Q2:有没有办法让它更快
如果有任何帮助,我们将不胜感激。这应该会更快,尽管有这么多行,您基本上存储了一个不断增长的正在计数的对象数组,而且由于它是一个
TINYTEXT
字段,所以它可能非常庞大
select Name,count(ID) from Table group by Name
我明白你在说什么了。以下是更新的SQL:
select DISTINCT TRIM(REPLACE(Name, ' (duplicate)', ''))
as name, count(ID) from Table group by name
只需删除“重复”文本:
哦,你真的在dublicate列中添加了(dublicate)?没有这样的标记。应为?所有名称长度是否为3个字符?@Mr47否,3-255个字符。表排序规则是
utf-8
。您可以计算name(replicate)
出现的次数,然后只添加1吗?这没有帮助<代码>(重复)s应包括在内<代码>:(因此,您的字段中有“重复”一词在它们里面?是的,我是。我需要计算它们。但是,看起来我发现了我的错误。谢谢。这是一个noobish错误…你的更新看起来像我的查询。谢谢你的努力。看起来我现在需要一个清醒的头脑…在写了很多复杂的查询之后,我的想法是错误的。不用担心。出于兴趣,接受的answer以分钟为单位给出sand结果?我确信我的查询是正确的。但我不确定“distinct”关键字会产生什么影响。请注意,我现在的查询中没有distinct
。按1分组
也这样做。你是对的。
select DISTINCT TRIM(REPLACE(Name, ' (duplicate)', ''))
as name, count(ID) from Table group by name
select replace(name, ' (duplicate)', ''), count(*)
from mytable
group by 1