Проверка повторных записей MySQL - PullRequest
0 голосов
/ 16 октября 2018

У меня есть таблица с записями двух переменных (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

Для каждого идентификатора я хочу проверить, используя 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 строк), и поэтому я бы предпочел не использовать медленные методы.Есть мысли?

Мы также не можем предположить, что только предыдущие идентификаторы имеют повторяющиеся данные, следовательно, запрос должен учитывать, что идентификаторы не равны друг другу.

Ответы [ 4 ]

0 голосов
/ 16 октября 2018

Вот некоррелированный метод ...

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

0 голосов
/ 16 октября 2018

Вы можете сделать это, используя Определяемые пользователем переменные сеанса .

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 
0 голосов
/ 16 октября 2018

Попробуйте этот запрос:

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

Демо

0 голосов
/ 16 октября 2018

Здесь мы можем использовать коррелированный подзапрос:

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

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...