如何获取大表中匹配字符串的数量

时间:2013-06-21 06:33:18

标签: mysql sql string count

我有一个包含以下结构的表:

+-----+-------------------+
| 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类型。并且会有很多行:测试模式中的 5396 。我试图通过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;

而且......好吧,在我的开发机器上花了4846行,结果是 122.62 秒(?!)。


Q1: 这是一种正确的做法吗?

Q2: 有没有办法让它更快?

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

只需删除“重复”文字:

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