您好我有下表T:
id 1 2 3 4
col a b a c
我想做一个选择,返回id,col当group by(col)有count(col)> 1
这样做的一种方法是
SELECT id,col FROM T
WHERE col IN (SELECT col FROM T GROUP BY(col) HAVING COUNT(col)>1);
实习生选择(从右侧)返回'a'而主要的一个(左)将返回1,a和3,a
问题是where语句似乎非常慢。在我的实际情况中,内部选择的结果有很多'col',约70000,而且需要几个小时。
现在,进行内部选择和主要选择获取所有ID和upcs并在本地进行交集要快得多。 MySQL应该能够有效地处理这种查询。
我可以用where替换联接或更快的东西吗?
由于
答案 0 :(得分:5)
您可以尝试使用INNER JOIN加快速度
col
col, id
上的覆盖索引可能会让您获得更好的表现SQL声明
SELECT T.id, T.col
FROM T
INNER JOIN (
SELECT col
FROM T
GROUP BY col
HAVING COUNT(*) > 1
) tcol ON tcol.col = T.col
答案 1 :(得分:2)
SELECT id, col
FROM t t1
WHERE EXISTS
(
SELECT NULL
FROM t t2
WHERE t2.col = t1.col
AND t2.id <> t1.id
)
确保您在(col)
(InnoDB
)或(col, id)
(MyISAM
)
内部查询一旦找到第一个匹配值就会停止评估。使用索引,这将在单个索引搜索最多两次索引扫描后发生。