我有一个包含以下结构的表:
+-----+-------------------+
| 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: 有没有办法让它更快?
任何帮助都将不胜感激。
答案 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