查询多个表以查找重复的一对一关系(按不同表中的多列分组)
Query multiple tables to find duplicate one to one relation (group by multiple column from diffeerent tables)
我有2张桌子
表 1:
id
columnA
1
one
2
two
3
one
表 2 :
table1_id
columnB
1
row1
2
row2
3
row1
是否可以通过单个查询从表 1 中获取 ID,其中列 A 中的重复值在列 B 中也有重复值:
像这个例子一样,table1 中的 id 1 和 3 在 columnA 和 columnB 中有重复的值
SELECT GROUP_CONCAT(table1.id)
FROM table1
JOIN table2 ON table1.id = table2.table1_id
GROUP BY table1.columnA, table2.columnB
HAVING COUNT(*) > 1
如果可以使用来自同一组的 ID 作为逗号分隔列,那么您可以使用以下查询(这将确保 table 对于给定的 columnA 或 columnB 值具有相同数量的重复 ID):
架构(MySQL v5.7)
create table table1 (id int, columnA varchar(20));
insert into table1 values(1,'one');
insert into table1 values(2,'two');
insert into table1 values(3,'one');
create table table2 (table1_id int, columnB varchar(20));
insert into table2 values(1,'one');
insert into table2 values(2,'two');
insert into table2 values(3,'one');
查询#1
select a.ids from
(SELECT GROUP_CONCAT(id) ids
FROM table1
GROUP BY columnA
HAVING COUNT(*) > 1) a
inner join
(SELECT GROUP_CONCAT(table1_id) table1_ids
FROM table2
GROUP BY columnB
HAVING COUNT(*) > 1) b
on a.ids=b.table1_ids;
ids
1,3
我有2张桌子
表 1:
id | columnA |
---|---|
1 | one |
2 | two |
3 | one |
表 2 :
table1_id | columnB |
---|---|
1 | row1 |
2 | row2 |
3 | row1 |
是否可以通过单个查询从表 1 中获取 ID,其中列 A 中的重复值在列 B 中也有重复值:
像这个例子一样,table1 中的 id 1 和 3 在 columnA 和 columnB 中有重复的值
SELECT GROUP_CONCAT(table1.id)
FROM table1
JOIN table2 ON table1.id = table2.table1_id
GROUP BY table1.columnA, table2.columnB
HAVING COUNT(*) > 1
如果可以使用来自同一组的 ID 作为逗号分隔列,那么您可以使用以下查询(这将确保 table 对于给定的 columnA 或 columnB 值具有相同数量的重复 ID):
架构(MySQL v5.7)
create table table1 (id int, columnA varchar(20));
insert into table1 values(1,'one');
insert into table1 values(2,'two');
insert into table1 values(3,'one');
create table table2 (table1_id int, columnB varchar(20));
insert into table2 values(1,'one');
insert into table2 values(2,'two');
insert into table2 values(3,'one');
查询#1
select a.ids from
(SELECT GROUP_CONCAT(id) ids
FROM table1
GROUP BY columnA
HAVING COUNT(*) > 1) a
inner join
(SELECT GROUP_CONCAT(table1_id) table1_ids
FROM table2
GROUP BY columnB
HAVING COUNT(*) > 1) b
on a.ids=b.table1_ids;
ids |
---|
1,3 |