我有一个表,其中包含两个变量(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彼此不相等。
答案 0 :(得分:4)
您可以使用User-defined Session variables进行此操作。
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;
答案 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
答案 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