改进SQL查询以删除出现次数超过N次的行

时间:2015-11-16 18:49:20

标签: mysql join concat

有更好的做法吗?

SELECT *
FROM table
WHERE CONCAT(a, b, c, d)  NOT IN 
(
  SELECT CONCAT(a, b, c, d) AS result
  FROM table
  GROUP BY result
  HAVING COUNT(*) < 40
)

我也尝试过使用一些连接,但内存不足。我想要做的是,如果a,b,c,d重复40次或更多次,则忽略该数据,否则返回。最后我将结果吐出为CSV。

编辑:示例数据

A  |B  |C  |D
---|---|---|---
123|ABC|ccc|ddd
123|ABC|ccc|ddd
... (40 times)
456|qwe|qqq|www
789|qwe|qqq|www

会回来:

456|qwe|qqq|www
789|qwe|qqq|www

2 个答案:

答案 0 :(得分:1)

在您的示例中,您有NOT IN(结果重复39次或更少),但您需要HAVING COUNT(*) >= 40

您可以尝试:

SELECT tba.*
FROM table tba
  INNER JOIN (SELECT a, b, c, d
               FROM table
              GROUP BY a, b, c, d
              HAVING COUNT(*) < 40
   ) as tbb ON tbb.a = tba.a AND tbb.b = tba.b AND tbb.c = tba.c AND tbb.d = tba.d

这样您就不需要更改HAVING了。

答案 1 :(得分:0)

试试这个:
SELECT *
从表作为
内连接(SELECT CONCAT(a,b,c,d)作为结果,count(*)为c
从表
按结果分组)作为CONCAT上的r(a,b,c,d)= r.result
其中c < 40个