检查重复记录的mysql

时间:2018-10-16 07:57:46

标签: mysql sql

我有一个表,其中包含两个变量(a, b)和一个id的记录,就像这样:

a,b,id    
x,y,1    
x,y,2    
x,z,3    
t,z,4    
t,y,5
t,y,6
t,y,7

对于每个id,我想使用mysql检查每对(a,b)变量是否已经出现,并将其分配给变量。例如,上一个输入的输出应为:

a,b,id,repeated    
x,y,1,1 - this should be 1 not zero    
x,y,2,1    
x,z,3,0   
t,z,4,0    
t,y,5,0
t,y,6,1
t,y,7,1

我应该对一个较大的表(700000行)执行此操作,因此我宁愿不使用慢速方法。有什么想法吗?

我们也不能假设只有先前的ID具有重复的数据,因此查询必须考虑到ID彼此不相等。

4 个答案:

答案 0 :(得分:4)

您可以使用User-defined Session variables进行此操作。

DB Fiddle DEMO

SELECT 
  IF(@a_var = dt.a AND 
     @b_var = dt.b, 
     1, 
     0) AS repeated, 
  @a_var := dt.a AS a, 
  @b_var := dt.b AS b, 
  dt.id 
FROM 
(
  SELECT 
    a, 
    b, 
    id
  FROM your_table 
  ORDER BY a,b,id
) AS dt 
CROSS JOIN (SELECT @a_var := '', 
                   @b_var := '') AS user_init_vars 

答案 1 :(得分:3)

我们可以在此处使用相关子查询:

SELECT
    a,
    b,
    id,
    CASE WHEN EXISTS (SELECT 1 FROM yourTable t2
                      WHERE t1.a = t2.a AND t1.b = t2.b AND t2.id < t1.id)
         THEN 1 ELSE 0 END AS repeated
FROM yourTable t1
ORDER BY
    id;

enter image description here

Demo

答案 2 :(得分:2)

尝试此查询:

select @aLag := '1', @bLag := '1';
select id, a, b, isRepeated from (
  select case when @aLag = a and @bLag = b then 1 else 0 end isRepeated,
         @ALag := a a,
         @bLag := b b,
         id
  from tbl
  order by a, b, id
) a order by id

Demo

答案 3 :(得分:2)

这是一种不相关的方法...

WITH yourTable AS (
    SELECT 'x' AS a, 'y' AS b, 1 AS id UNION ALL
    SELECT 'x', 'y', 2 UNION ALL
    SELECT 'x', 'z', 3 UNION ALL
    SELECT 't', 'z', 4 UNION ALL
    SELECT 't', 'y', 5 UNION ALL
    SELECT 't', 'y', 6 UNION ALL
    SELECT 't', 'y', 7
)

SELECT DISTINCT x.*
              , y.a IS NOT NULL repeated
  FROM yourTable x
  LEFT
  JOIN yourTable y 
    ON y.a = x.a 
   AND y.b = x.b
   AND y.id < x.id;

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=924d776f772007af9d46f36a5daaf8e2