假设我想修改表格,使我的主键如下:
user_id
,round
,tournament_id
。目前有一些重复的行需要清理。查询所有重复行的语句是什么?这是针对MySQL的,我想看到重复的行。user_id
,round
,tournament_id
。目前有一些重复的行需要清理。查询所有重复行的语句是什么?这是针对MySQL的,我想看到重复的行。从技术上讲,您不需要这样的查询;任何值得一提的关系型数据库都不会允许在表中插入将产生重复主键的行。这种情况违反了主键的定义。
但是,如果您想编写一个查询来查找这些列组的重复项,并在将由这些列组成的主键应用于表之前进行操作,那么以下是所需内容:
select
t.user_id, t.round, t.tournament_id
from
table as t
group by
t.user_id, t.round, t.tournament_id
having
count(*) > 1
如果您想查看包含多个行的列的组合,只需使用上面的代码即可。但是,如果您想查看每一行中的所有列,那么您需要执行以下操作:
select
o.*
from
table as o
inner join (
select
t.user_id, t.round, t.tournament_id
from
table as t
group by
t.user_id, t.round, t.tournament_id
having
count(*) > 1
) as t on
t.user_id = o.user_id and
t.round = o.round and
t.tournament_id = o.tournament_id
SELECT name, COUNT(*) AS counter
FROM customers
GROUP BY name
HAVING COUNT (*) > 1
这就是你要寻找的东西。
在table
中:
ID NAME email
-- ---- -----
1 John Doe john@teratrax.com
2 Mark Smith marks@teratrax.com
3 John Doe jdoe@company.com
将返回
name counter
---- -------
John Doe 2
select user_id, round, tournament_id
from yourtable
group by user_id, round, tournament_id
having count(*) > 1
此查询从客户表中选择所有具有重复名称的行,但还显示每个重复项的电子邮件。
SELECT c.name, c.email FROM customers c, customers d
WHERE c.name = d.name
GROUP BY c.name, c.email
HAVING COUNT(*) > 1
SELECT
子句中,一次在GROUP BY
子句中。另一种方法是使用子查询或连接来根据已知重复键列表过滤表格。