MySQL Query:在一个非常庞大的表中计算重复值

时间:2011-04-19 16:38:55

标签: mysql select count

我有这个MySQL表:

CREATE TABLE `triple` (
  `id_one` int(11) NOT NULL,
  `id_two` int(11) NOT NULL,
  `id_three` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

它共有近1000万行。中间列中的ID(“id_two”)可以在不同的行中出现。

简短示例:

id_one    id_two    id_three
1         2         3
2         2         3
3         2         1
68        98        1
1         4         3
2         4         4
4         5         33
6         5         3
90        5         3
34        5         83
9         3         98

现在我想计算不同的ID(“id_two”),就是在这个例子中:

id_two     count
2     ->  3
98    ->  1
4     ->  2
5     ->  4
3     ->  1

如何有效地实现这一目标? (这是一次性工作......)这是第一件事。我需要做的第二件事是:要像上面那样计算,然后只选择那些有更多数量的ID,然后让我们说100。

非常感谢您的帮助!

亲切的问候 Aufwind

6 个答案:

答案 0 :(得分:5)

实现这一目标的基本命令是:

SELECT id_two, count(*) FROM triple GROUP BY id_two;

如果您想要,可以将其存储在临时表中。

CREATE TEMPORARY TABLE xxx SELECT id_two, count(*) AS c FROM …
SELECT * FROM xxx WHERE c > 100;

...或在外部查询中使用结果...

SELECT * FROM (SELECT id_two, count(*) AS c FROM triple GROUP BY id_two) t WHERE c > 100;

...或使用HAVING子句(正如Marc在评论中所建议的那样):

SELECT id_two, count(*) AS c FROM triple GROUP BY id_two HAVING c > 100;

答案 1 :(得分:4)

SELECT id_two, COUNT(*)
    FROM triple
    GROUP BY id_two
    HAVING COUNT(*) > 100

答案 2 :(得分:3)

问题1:

SELECT id_two, COUNT(1)
  FROM triple
GROUP BY id_two

问题2:

SELECT id_two, COUNT(1)
  FROM triple
GROUP BY id_two
HAVING COUNT(1) > 100

答案 3 :(得分:1)

对于你的“第二件事”,请使用HAVING

SELECT id_two, count(*) nb FROM triple GROUP BY id_two HAVING nb >= 100;

索引字段id_two应该会提升性能。

答案 4 :(得分:1)

对于1000万行表上的一次性工作,我只是完全跳过SQL。尝试使用GROUP BY可能会将表锁定太长时间。

SELECT id_two FROM TRIPLE INTO OUTFILE('/tmp/idtwo.txt')

在类Unix系统上,这将产生一个包含两列的列表:出现次数,ID

# sort -n /tmp/idtwo.txt | uniq -c

..如果必须使用GROUP BY,请在select语句的末尾添加ORDER BY NULL以节省一些时间。否则,MySQL将尝试按the default order(id_two的值)对您的组进行排序。

答案 5 :(得分:0)

试试这个:

select id_two,Frequency=count(*)
from triple
group by id_two
having count(*) > 1 -- replace 1 with desired threshold