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

Auf*_*ind 5 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
Run Code Online (Sandbox Code Playgroud)

它共有近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
Run Code Online (Sandbox Code Playgroud)

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

id_two     count
2     ->  3
98    ->  1
4     ->  2
5     ->  4
3     ->  1
Run Code Online (Sandbox Code Playgroud)

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

非常感谢您的帮助!

亲切的问候Aufwind

sou*_*rge 5

完成此任务的基本命令是这样的:

SELECT id_two, count(*) FROM triple GROUP BY id_two;
Run Code Online (Sandbox Code Playgroud)

如果你想......你可以将它存储在临时表中

CREATE TEMPORARY TABLE xxx SELECT id_two, count(*) AS c FROM …
SELECT * FROM xxx WHERE c > 100;
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM (SELECT id_two, count(*) AS c FROM triple GROUP BY id_two) t WHERE c > 100;
Run Code Online (Sandbox Code Playgroud)

...或使用HAVING条款(如Marc在评论中所建议的):

SELECT id_two, count(*) AS c FROM triple GROUP BY id_two HAVING c > 100;
Run Code Online (Sandbox Code Playgroud)

  • 嗯,为什么不直接使用'having'条款?`选择id_two,计数(*)作为来自旅行组的cnt,id_two,cnt> 100`.没有临时表,没有子选择...... (2认同)