programing

MySQL에서 중복 레코드만 선택하여 표시

i4 2023. 9. 3. 12:10
반응형

MySQL에서 중복 레코드만 선택하여 표시

이 질문은 매우 간단합니다. 어떤 이유로 인해 중복 레코드만 표시할 수 있는 적절한 결과를 얻을 수 없습니다.

Table   : Paypal_ipn_orders
id                              payer_email
1                               susan@gmail.com
2                               ryan@gmail.com   
3                               susan@gmail.com
4                               steve@gmail.com
5                               steve@gmail.com

SELECT id, COUNT( payer_email ) `tot`
FROM paypal_ipn_orders
GROUP BY payer_email
HAVING `tot` >1

샘플 출력

id       tot
1         2
4         2

예상 생산량

id       payer_email 
1        susan@gmail.com
3        susan@gmail.com
4        steve@gmail.com
5        steve@gmail.com

어떻게 하면 이런 일이 생길 수 있을까요?

SELECT id, payer_email
FROM paypal_ipn_orders
WHERE payer_email IN (
    SELECT payer_email
    FROM paypal_ipn_orders
    GROUP BY payer_email
    HAVING COUNT(id) > 1
)

squlifidle

IN내 상황에서 너무 느렸습니다(180초).

그래서 저는.JOIN대신(0.3초)

SELECT i.id, i.payer_email
FROM paypal_ipn_orders i
INNER JOIN (
 SELECT payer_email
    FROM paypal_ipn_orders 
    GROUP BY payer_email
    HAVING COUNT( id ) > 1
) j ON i.payer_email=j.payer_email

다음은 간단한 예입니다.

select <duplicate_column_name> from <table_name> group by <duplicate_column_name> having count(*)>=2

분명히 효과가 있을 겁니다.:)

테이블에서 모든 중복 행 목록 가져오기:

Select * from TABLE1 where PRIMARY_KEY_COLUMN NOT IN ( SELECT PRIMARY_KEY_COLUMN
FROM TABLE1 
GROUP BY DUP_COLUMN_NAME having (count(*) >= 1))

두 행 데이터에 대해 동일하지 않거나 동일할 수 있는 열 값을 하나 이상 선택하려는 경우 위의 답변이 작동하지 않습니다.

예를 들어, 사용자 이름과 생년월일을 선택하고 싶습니다.그러나 데이터베이스에서 사용자 이름이 중복되지 않지만 생일이 중복되면 이 솔루션이 작동하지 않습니다.

이 솔루션을 사용하려면 동일한 테이블에 직접 참여해야 합니다.

SELECT  
    distinct(p1.id),  p1.payer_email , p1.username, p1.birth_date

FROM 
    paypal_ipn_orders AS p1 

INNER JOIN paypal_ipn_orders AS p2 

ON p1.payer_email=p2.payer_email

WHERE 

p1.birth_date=p2.birth_date

위 쿼리는 동일한 email_id 및 동일한 생년월일을 가진 모든 레코드를 반환합니다.

이것이 저에게 가장 빨리 작동합니다.

SELECT
    primary_key
FROM
    table_name
WHERE
    primary_key NOT IN (
        SELECT
            primary_key
        FROM
            table_name
        GROUP BY
            column_name
        HAVING
            COUNT(*) = 1
    );

이 코드를 사용합니다.

 SELECT *  
    FROM  paypal_ipn_orders 
    GROUP BY  payer_email  
    HAVING COUNT( payer_email) >1  
SELECT id, payer_email FROM paypal_ipn_orders
WHERE payer_email IN (
    SELECT payer_email FROM papypal_ipn_orders GROUP BY payer_email HAVING COUNT(*) > 1)

답변과 유사하게 임시 테이블을 대신 사용했습니다.

CREATE TEMPORARY TABLE duplicates (
    SELECT payer_email
    FROM paypal_ipn_orders
    GROUP BY payer_email
    HAVING COUNT(id) > 1
);
SELECT id, payer_email
FROM paypal_ipn_orders AS p
INNER JOIN duplicates AS d ON d.payer_email=p.payer_email;
SELECT * FROM `table` t1 join `table` t2 WHERE (t1.name=t2.name) && (t1.id!=t2.id)

저는 이 방법이 더 간단하다고 생각합니다.출력에는 지불인의 전자 메일이 이 테이블의 두 개 이상의 레코드에 있는 ID와 지불인의 전자 메일이 표시됩니다.결과는 ID별로 정렬됩니다.

    SELECT id, payer_email
    FROM paypal_ipn_orders
    WHERE COUNT( payer_email )>1
    SORT BY id;

다음 쿼리를 시도해 보십시오.

SELECT id, COUNT( payer_email ) `tot`
FROM paypal_ipn_orders
GROUP BY id
HAVING `tot` >1

도움이 되나요?

언급URL : https://stackoverflow.com/questions/11694761/select-and-display-only-duplicate-records-in-mysql

반응형