我有这个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
答案 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