2016-07-12 4 views
0

나는 등, 같은 테이블에 서로 2 주 내에있는 기록을 찾고 있었다 :MySQL에서 대칭 결과를 초래하는 자체 조인을 피하는 방법은 무엇입니까?

SELECT stuff 
    FROM mytable AS a 
    JOIN mytable AS b 
    ON a.ID = b.ID 
    WHERE  
(
    a.Date = b.Date 
    OR 
    a.Date BETWEEN DATE_SUB(b.Date, INTERVAL 14 DAY) AND DATE_ADD(b.Date, INTERVAL 14 DAY) 
    OR 
    b.Date BETWEEN DATE_SUB(a.Date, INTERVAL 14 DAY) AND DATE_ADD(a.Date, INTERVAL 14 DAY) 
) 
    ; 

그것은 잘 작동하지만, 지금은 구조 이러한 유형의 결과가 있습니다

| ID | a.Date  | b.Date  | a.Value | b.Value | 
|----|------------|------------|---------|---------| 
| 1 | 2016-01-01 | 2016-01-02 | foo  | bar  | 
| 1 | 2016-01-02 | 2016-01-01 | bar  | foo  | 

이 복제 된 구조로 연결되는 나쁜 방법으로 조인했거나 조인은 괜찮지 만 키랄 레코드를 제거하는 방법이 필요합니다. 누구든지 진행 방법에 대해 조언 해 줄 수 있습니까?

답변

1

추가 : WHERE 절에

a.Value < b.Value 

.

또는 기본 키가있는 경우 더 나은 아직, (그리고 모든 테이블이 있어야 기본 키) :

a.pk < b.pk