2016-07-12 16 views
0

Ich war für Aufzeichnungen suchen, innerhalb von 2 Wochen voneinander sind:Wie vermeiden Sie Self-Joins, die zu symmetrischen Ergebnissen in MySQL führen? , In der gleichen Tabelle, die als solche

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) 
) 
    ; 

Es funktionierte gut, aber jetzt habe ich ein Ergebnis mit dieser Art von Struktur:

| 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  | 

Entweder ich habe meine Verbindung in einer schlechten Art und Weise, die zu dieser doppelten Struktur führt, oder die Verbindung ist in Ordnung, aber ich brauche einen Weg, um die chirale Aufzeichnung zu entfernen. Kann mir jemand raten, wie es weitergeht?

Antwort

1

Anzahl:

a.Value < b.Value 

zum WHERE Klausel.

Oder, noch besser, wenn Sie einen Primärschlüssel haben (und alle Tabellen sollten einen Primärschlüssel):

a.pk < b.pk