2015-01-23 5 views
0

데이터베이스에 관해서는 완전히 쓸모가 없지만 현재는 그 작업을해야합니다.두 항목 사이의 동일한 필드의 MySQL 비교 - 쿼리는 영원히 걸립니다

내 테이블의 다른 항목 사이의 날짜 값을 비교하는 쿼리를 만들어야합니다. 다음과 같은 쿼리가 있습니다.

SELECT t1.serial_number, t1.fault_type, t2.fault_type 
FROM shipped_products t1 
     JOIN shipped_products t2 ON t1.serial_number=t2.serial_number 
WHERE ABS(DATEDIFF(t2.date_rcv,t1.date_rcv))<90; 

하지만 실행하는 데 오래 걸립니다. 정말로, 나는 18 시간 동안 달리기를 그만 두었고 결코 멈추지 않았다. 이 쿼리가 정확합니까? 이 일을하는 더 나은, 영리한 방법이 있습니까?

대단히 감사합니다.

BTW : 모든 프로세스를 파이썬 스크립트로 자동화 할 것이므로, 파이썬 내부에서 모든 로직을 쿼리 내부에 넣지 않고이 작업을 수행하는 더 좋은 방법을 알고 있다면 도움이 될 것입니다.

편집 : 내 질문이 분명하지 않아서 내가해야 할 일을 더 잘 설명하겠습니다. 제품 수리 센터로 이동하여 "결함 없음"으로 고객에게 반송되는 경우가 있습니다. 그 후 클라이언트는 수리 센터에 수리를 의뢰하고 동일한 문제를 제시합니다. 따라서 90 일 간격으로 두 번 센터를 수리 한 제품의 수를 계산하는 쿼리가 필요합니다. 각각의 단일 제품에 대한 유니크 ID는 일련 번호이며, 그 때문에 나는 비현실적인 번호 중복을 찾고 있습니다.

+1

테이블에 몇 개의 레코드가 있습니까? 당신의'where'는 파생/계산 된 값에 의존하기 때문에, 속도를 높이기 위해 인덱스를 사용할 수 없습니다. –

+1

쿼리에서 수행 할 작업을 설명 할 수 있습니까? 샘플 데이터와 원하는 결과는 큰 도움이됩니다. –

+0

좋은 SQL로 처리 할 수있는 부분은 거기에서 처리해야합니다. 파이썬 로직에서 처리 할 초과 행을 전달하는 것은 훨씬 효율적이지 않습니다. – msw

답변

1

DateDiff가 동일하므로 90보다 작기 때문에 모든 레코드가이 조인에서 자체적으로 일치합니다 (t1 및 t2). 동일한 레코드와 일치하지 않는지 확인하십시오. 테이블에 ID 필드가있는 경우 다음을 수행 할 수 있습니다.

SELECT t1.serial_number, t1.fault_type, t2.fault_type 
FROM shipped_products t1 
     JOIN shipped_products t2 
     ON t1.serial_number=t2.serial_number 
     AND t1.ID <> t2.ID 
WHERE ABS(DATEDIFF(t2.date_rcv,t1.date_rcv))<90; 

또한 serial_number에 키가 있는지 확인하십시오.

0

왜 결과에 중복이 필요한지 불분명합니다. 조건을 충족시키는 두 개의 행이있는 경우 두 행 모두 결과 집합에 포함됩니다. 왜 나중에 나오는 기록을 보지 않으시겠습니까?

SELECT t1.serial_number, t1.fault_type, t2.fault_type 
FROM shipped_products t1 JOIN 
     shipped_products t2 
    ON t1.serial_number = t2.serial_number 
WHERE t2.date_recv >= t1.date_rcv and 
     t2.date_recv < t1.date_recv + interval 90 day; 

그런 다음 결과 쿼리가 shipped_products(serial_number, date_recv)에 인덱스를 활용할 수 있습니다 : 당신이 문구과 같이 질의합니다. 참고 : 아마도 90은 180이어야합니다.

이 유형의 자체 조인을 볼 때 나는 의심 스럽습니다. 경우에 따라 집계 쿼리로 대체 될 수 있습니다 (때로는 그렇지 않음). 그러나 실제로하고 싶은 것은 불분명합니다.

+0

나는 너의 대답이 내 것보다 더 좋아한다고 생각한다. 하지만 WHERE 절의 첫 번째 부분은>, =>이 아닐 것이라고 생각합니다. 그렇지 않으면 레코드 자체가 일치합니다. – Tom

+0

@Tom. . . 원래 코드는 레코드 일치 자체를가집니다. 나는 이것이별로 의미가 없을 수도 있다는 것에 동의하지만 OP는 여전히 코드가 실제로 원하는 것을 설명하지 않았다. –

+0

안녕 얘들 아, 해줘서 고마워. 제품을 수리 센터로 보내고 고객에게 "결함 없음"으로 배송되는 경우가 있습니다. 그 후 클라이언트는 수리 센터에 수리를 의뢰하고 동일한 문제를 제시합니다. 그래서 90 일 간격으로 두 번 센터를 수리 한 제품 수를 계산하는 쿼리가 필요합니다. 각각의 단일 제품에 대한 유니크 ID는 일련 번호이며, 그 때문에 나는 비현실적인 번호 중복을 찾고 있습니다. 감사합니다. –

관련 문제