如何避免在 MySQL 中导致对称结果的自连接?
How to avoid self-joins that result in symmetric results in MySQL?
我正在寻找在同一 table 中彼此相隔 2 周以内的记录,例如:
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 |
要么我以错误的方式进行了连接,导致了这种重复的结构,要么连接没问题,但我需要一些方法来删除手性记录。谁能告诉我如何进行?
添加:
a.Value < b.Value
到 WHERE
子句。
或者,更好的是,如果您有一个主键(并且 所有 表都应该有一个主键):
a.pk < b.pk
我正在寻找在同一 table 中彼此相隔 2 周以内的记录,例如:
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 |
要么我以错误的方式进行了连接,导致了这种重复的结构,要么连接没问题,但我需要一些方法来删除手性记录。谁能告诉我如何进行?
添加:
a.Value < b.Value
到 WHERE
子句。
或者,更好的是,如果您有一个主键(并且 所有 表都应该有一个主键):
a.pk < b.pk