2013-06-21 29 views
0

我有以下结构的表:如何获得匹配串的数量在一个大桌子

+-----+-------------------+ 
| ID | Name    | 
+-----+-------------------+ 
| 1 | abc    | 
+-----+-------------------+ 
| 2 | abc (duplicate) | 
+-----+-------------------+ 
| 3 | bcd    | 
+-----+-------------------+ 
| 4 | bcd (duplicate) | 
+-----+-------------------+ 
| 5 | bcd (duplicate) | 
+-----+-------------------+ 
| 6 | efg    | 
+-----+-------------------+ 
| 7 | hij    | 
+-----+-------------------+ 

我要统计每个Name次数(含(duplicate)含税),即:

+-------------------+--------+ 
| Name    | Count | 
+-------------------+--------+ 
| abc    |  2 | 
+-------------------+--------+ 
| bcd    |  3 | 
+-------------------+--------+ 
| efg    |  1 | 
+-------------------+--------+ 
| hij    |  1 | 
+-------------------+--------+ 

我想提一下,那Name这一列实际上有类型TINYTEXT。并且会有很多行: in test mode already。我试图让自己的TRIM(REPLACE(Name, '(duplicate)', ''))与分组连接表:

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:有什么办法可以让它更快吗?

任何帮助,将不胜感激。

+1

哦,你居然加**(dublicate)**? – devnull

+0

有没有这样的标记。应该? – BlitZ

+0

所有名称的长度均为3个字符? – Mr47

回答

1

只需删除 “重复” 的文本:在* dublicate *列

select replace(name, ' (duplicate)', ''), count(*) 
from mytable 
group by 1 
+0

感谢您的努力,看起来我现在需要一个清晰的头......我写了很多复杂的查询后,思考错误的方式 – BlitZ

+0

无后顾之忧,我敢肯定,我的查询是正确的,但我不确定“distinct”关键字会有什么影响。让我们知道 – Bohemian

+0

我的查询中没有'DISTINCT' 。GROUP BY 1'也是这样,你是对的。 – BlitZ

1

这应该更快,虽然有很多行,你基本上正在存储一个数量不断增加的对象,因为它是一个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 
+0

它没有帮助。 '(重复)应该包括在内。 ':('' – BlitZ

+0

所以你有字段中有“重复”的字词吗? –

+0

是的,我是,我需要它们来计算,但是看起来我发现我的错误在哪儿了 – BlitZ

相关问题