我正在尝试筛选包含数千条记录的表,我需要获得真正的重复行。我的意思是所有列相同的记录。
我目前正在使用这样的东西,但它显然只在column_1中找到重复:
SELECT * FROM `table`
WHERE `column_1` IN (
SELECT `column_1` FROM `table`
GROUP BY `column_1`, `column_2`, `column_3`
HAVING COUNT(id) > 1
)
我如何编写此内容以获取重复的行,其中所有列都是重复的,不包括ID? 没有列出表格中的所有列?
答案 0 :(得分:1)
很容易让查询适用于所有列,假设没有NULL
个值:
SELECT t.*
FROM `table` t
WHERE (`column_1`, `column_2`, `column_3`) IN (
SELECT `column_1`, `column_2`, `column_3`
FROM `table` t2
GROUP BY `column_1`, `column_2`, `column_3`
HAVING COUNT(id) > 1
);
如果您有NULL
个值,则需要NULL
安全比较:
SELECT t.*
FROM `table` t JOIN
(SELECT `column_1`, `column_2`, `column_3`
FROM `table` t2
GROUP BY `column_1`, `column_2`, `column_3`
HAVING COUNT(id) > 1
) tt
ON (NOT tt.column_1 <=> t.column_1) AND
(NOT tt.column_2 <=> t.column_2) AND
(NOT tt.column_3 <=> t.column_3);
当然,这远远超出了简单的目标。
为什么你需要看到每个副本都很好奇。为什么不这样做:
SELECT `column_1`, `column_2`, `column_3`, COUNT(*)
FROM `table` t2
GROUP BY `column_1`, `column_2`, `column_3`
HAVING COUNT(id) > 1
但在这两种情况下,您需要列出所有列(至少一次)。我不认为在MySQL中有办法做到这一点。有些数据库允许您为整行创建JSON对象或XML对象 - 这样就可以在不列出所有列的情况下实现。我想不出MySQL中的任何类似内容。