MySQL에서 중복된 값 찾기
varchar 컬럼이 있는 테이블이 있는데 이 컬럼에 중복된 값이 있는 모든 레코드를 찾고 싶습니다.중복된 항목을 찾기 위해 사용할 수 있는 최선의 쿼리는 무엇입니까?
해요.SELECT
a GROUP BY
절을 클릭합니다.예를 들어 name이 중복되는 컬럼이라고 합시다.
SELECT name, COUNT(*) c FROM table GROUP BY name HAVING c > 1;
그러면 첫 번째 열에 이름 값이 포함된 결과가 반환되고 두 번째 열에 해당 값이 나타나는 횟수의 카운트가 반환됩니다.
SELECT varchar_col
FROM table
GROUP BY varchar_col
HAVING COUNT(*) > 1;
SELECT *
FROM mytable mto
WHERE EXISTS
(
SELECT 1
FROM mytable mti
WHERE mti.varchar_column = mto.varchar_column
LIMIT 1, 1
)
는 고유 레코드뿐만 합니다.varchar_column
의 discriptions
이쿼쿼 this this this 、 this 、 this 、 this 、 this 、 this 、 。COUNT(*)
되는 부분이 icates . . . . . . COUNT(*)
은 아닙니다.COUNT(*)
같은 값을 가진 행이 두 개 있는지 확인만 하면 됩니다.
이것은, 에 의해서 실현됩니다.LIMIT 1, 1
("varchar_column"이라는 뜻) 두 존재하는 EXISTES는 앞서 말한 두 번째 행이 존재하는 경우에만 true를 반환합니다(즉, varchar_column 값이 같은 행이 적어도2개 있습니다).
덱덱 on having having having having 。varchar_column
물론 이 질문의 속도를 크게 높일 수 있습니다.
레빅을 할 수.GROUP_CONCAT
서버가 지원하는 경우(쉼표로 구분된 ID 목록이 반환됩니다).
SELECT GROUP_CONCAT(id), name, COUNT(*) c
FROM documents
GROUP BY name
HAVING c > 1;
중복이 포함된 모든 데이터를 가져오기 위해 다음을 사용했습니다.
SELECT * FROM TableName INNER JOIN(
SELECT DupliactedData FROM TableName GROUP BY DupliactedData HAVING COUNT(DupliactedData) > 1 order by DupliactedData)
temp ON TableName.DupliactedData = temp.DupliactedData;
TableName = 작업 중인 테이블입니다.
DuplicatedData = 찾고 있는 중복 데이터입니다.
테이블이 테이블로 명명된 경우ABC와 당신이 원하는 열은 Col이고 T1의 주요 키는 Key입니다.
SELECT a.Key, b.Key, a.Col
FROM TableABC a, TableABC b
WHERE a.Col = b.Col
AND a.Key <> b.Key
위의 답변에 비해 이 접근법의 장점은 키를 제공한다는 것입니다.
더 나아가 @maxyfc의 답변으로, MySQL Workbench에서 편집할 수 있도록 중복된 값을 사용하여 반환된 모든 행을 찾아야 했습니다.
SELECT * FROM table
WHERE field IN (
SELECT field FROM table GROUP BY field HAVING count(*) > 1
) ORDER BY field
SELECT *
FROM `dps`
WHERE pid IN (SELECT pid FROM `dps` GROUP BY pid HAVING COUNT(pid)>1)
[ Employee ]의 [Name]컬럼에 중복되는 레코드의 수를 확인하려면 , 다음의 조회가 도움이 됩니다.
Select name from employee group by name having count(*)>1;
마지막 질문에는 그룹 바이, 카운트, GROUP_CONCAT의 조합에 도움이 되는 답변이 몇 가지 포함되어 있습니다.
SELECT GROUP_CONCAT(id), `magento_simple`, COUNT(*) c
FROM product_variant
GROUP BY `magento_simple` HAVING c > 1;
이것은 두 예제의 ID(쉼표로 구분), 필요한 바코드 및 중복 수를 제공합니다.
이에 따라 테이블과 열을 변경합니다.
JOIN 어프로치는 없습니다.복제적으로 많은 용도가 있습니다.
이 접근방식을 사용하면 실제로 두 배의 결과를 얻을 수 있습니다.
SELECT t1.* FROM my_table as t1
LEFT JOIN my_table as t2
ON t1.name=t2.name and t1.id!=t2.id
WHERE t2.id IS NOT NULL
ORDER BY t1.name
위 결과를 보았는데 중복된 단일 컬럼 값을 확인해야 한다면 쿼리는 정상적으로 동작합니다.예를 들어 이메일.
그러나 더 많은 열을 확인해야 하고 이 쿼리가 제대로 작동하도록 결과의 조합을 확인해야 하는 경우:
SELECT COUNT(CONCAT(name,email)) AS tot,
name,
email
FROM users
GROUP BY CONCAT(name,email)
HAVING tot>1 (This query will SHOW the USER list which ARE greater THAN 1
AND also COUNT)
창 함수(MySQL 8.0+)를 사용하여 전체 행을 볼 수 있으므로 중복 항목을 찾는 것이 좋습니다.
WITH cte AS (
SELECT *
,COUNT(*) OVER(PARTITION BY col_name) AS num_of_duplicates_group
,ROW_NUMBER() OVER(PARTITION BY col_name ORDER BY col_name2) AS pos_in_group
FROM table
)
SELECT *
FROM cte
WHERE num_of_duplicates_group > 1;
SELECT t.*,(select count(*) from city as tt
where tt.name=t.name) as count
FROM `city` as t
where (
select count(*) from city as tt
where tt.name=t.name
) > 1 order by count desc
도시를 테이블로 바꿉니다.이름을 필드 이름으로 바꿉니다.
SELECT
t.*,
(SELECT COUNT(*) FROM city AS tt WHERE tt.name=t.name) AS count
FROM `city` AS t
WHERE
(SELECT count(*) FROM city AS tt WHERE tt.name=t.name) > 1 ORDER BY count DESC
다음은 두 번 이상 사용되는 모든 product_id를 검색합니다.각 product_id에 대해 하나의 레코드만 얻을 수 있습니다.
SELECT product_id FROM oc_product_reward GROUP BY product_id HAVING count( product_id ) >1
코드: http://chandreshrana.blogspot.in/2014/12/find-duplicate-records-based-on-any.html 에서 취득
CREATE TABLE tbl_master
(`id` int, `email` varchar(15));
INSERT INTO tbl_master
(`id`, `email`) VALUES
(1, 'test1@gmail.com'),
(2, 'test2@gmail.com'),
(3, 'test1@gmail.com'),
(4, 'test2@gmail.com'),
(5, 'test5@gmail.com');
QUERY : SELECT id, email FROM tbl_master
WHERE email IN (SELECT email FROM tbl_master GROUP BY email HAVING COUNT(id) > 1)
SELECT ColumnA, COUNT( * )
FROM Table
GROUP BY ColumnA
HAVING COUNT( * ) > 1
이것으로부터 개선했습니다.
SELECT
col,
COUNT(col)
FROM
table_name
GROUP BY col
HAVING COUNT(col) > 1;
SELECT DISTINCT a.email FROM `users` a LEFT JOIN `users` b ON a.email = b.email WHERE a.id != b.id;
중복된 결과의 ID도 찾을 수 있는 Levik의 답변의 변형으로 다음을 사용했습니다.
SELECT * FROM table1 WHERE column1 IN (SELECT column1 AS duplicate_value FROM table1 GROUP BY column1 HAVING COUNT(*) > 1)
여러 필드가 있는 중복 행을 삭제하는 경우 먼저 고유한 행에만 지정된 새 고유 키로 행을 지정한 후 "group by" 명령을 사용하여 동일한 새 고유 키를 가진 중복 행을 제거할 수 있습니다.
Create TEMPORARY table tmp select concat(f1,f2) as cfs,t1.* from mytable as t1;
Create index x_tmp_cfs on tmp(cfs);
Create table unduptable select f1,f2,... from tmp group by cfs;
아주 늦은 기고문 하나...혹시라도 그게 도움이 될까봐...은행 앱에서 일치하는 트랜잭션 쌍(실제로 계정 간 이체 양쪽)을 찾아 각 계좌 간 이체 트랜잭션의 '발신인'과 '수신인'을 식별하는 작업을 수행했습니다.그래서 우리는 다음과 같은 결과를 얻었습니다.
SELECT
LEAST(primaryid, secondaryid) AS transactionid1,
GREATEST(primaryid, secondaryid) AS transactionid2
FROM (
SELECT table1.transactionid AS primaryid,
table2.transactionid AS secondaryid
FROM financial_transactions table1
INNER JOIN financial_transactions table2
ON table1.accountid = table2.accountid
AND table1.transactionid <> table2.transactionid
AND table1.transactiondate = table2.transactiondate
AND table1.sourceref = table2.destinationref
AND table1.amount = (0 - table2.amount)
) AS DuplicateResultsTable
GROUP BY transactionid1
ORDER BY transactionid1;
, 과, 과, 과, 과, the, the, the, the, the, the, the.DuplicateResultsTable
는 일치하는쌍과 두 때한 트랜잭션 ID가 제공됩니다.SELECT
ID로 수이는 첫 번째 트랜잭션 ID로 할 수 .LEAST
★★★★★★★★★★★★★★★★★」GREATEST
가 항상 이 경우 는 안전하게 할 수 .GROUP
따라서 중복되는 일치가 모두 제거됩니다.거의 100만 개의 기록을 조사하여 불과 2초 이내에 12,000개 이상의 일치 항목을 식별했습니다.transactionid, transactionid, transactionid, transactionid 】, 【트랜잭션 ID】, 【트랜잭션 ID】, 【트랜잭션 ID】
Select column_name, column_name1,column_name2, count(1) as temp from table_name group by column_name having temp > 1
하는 경우DISTINCT
그렇지 않으면 다음 쿼리를 사용합니다.
SELECT users.*,COUNT(user_ID) as user FROM users GROUP BY user_name HAVING user > 1;
@novocaine님의 훌륭한 답변과 해결방안이 제게 효과가 있었습니다.제 경우 필요한 반복값의 비율을 포함하도록 약간 수정했습니다.변경된 버전은 다음과 같습니다.소수점 이하 두 자리까지 백분율을 낮춥니다.2를 0으로 변경하면 소수점 이하가 표시되지 않고 1로 변경되면 소수점 이하가 1자리씩 표시됩니다.
SELECT GROUP_CONCAT(id), name, COUNT(*) c,
COUNT(*) OVER() AS totalRecords,
CONCAT(FORMAT(COUNT(*)/COUNT(*) OVER()*100,2),'%') as recurringPecentage
FROM table
GROUP BY name
HAVING c > 1
다음 쿼리를 사용해 보십시오.
SELECT name, COUNT(*) value_count FROM company_master GROUP BY name HAVING value_count > 1;
언급URL : https://stackoverflow.com/questions/688549/finding-duplicate-values-in-mysql
'programing' 카테고리의 다른 글
봄의 @Value 기본값으로 null을 설정할 수 있습니까? (0) | 2023.02.03 |
---|---|
대기열 테이블에서 사용자 위치를 가져오는 데 너무 느립니다. (0) | 2023.01.24 |
Vue Router, 새로 고침 시 공백 페이지가 표시됨 (0) | 2023.01.24 |
가장 좋은 PHP 입력 삭제 기능은 무엇입니까? (0) | 2023.01.24 |
del, remove 및 pop on 목록의 차이 (0) | 2023.01.24 |