2013-02-20 84 views
0

多多包涵,我是新來的SQL和我有麻煩解釋這個...MySQL的 - 在一個給定的日期前選擇最近的記錄JOIN

我有類似下面的兩個表:

test1 
+------+----------+----------+-----------+ 
| id | serial | t1data | t1date | 
+------+----------+----------+-----------+ 
| 1 | a  | ... | 6/02/12 | 
| 2 | a  | ... | 6/04/12 | 
| 3 | b  | ... | 6/06/12 | 
| 4 | a  | ... | 6/08/12 | 
+------+----------+----------+-----------+ 

test2 
+------+----------+----------+-----------+ 
| id | serial | t2data | t2date | 
+------+----------+----------+-----------+ 
| 1 | a  | ... | 6/05/12 | 
| 2 | b  | ... | 6/07/12 | 
| 3 | b  | ... | 6/08/12 | 
| 4 | a  | ... | 6/09/12 | 
+------+----------+----------+-----------+ 

我想創建一個查詢聯接兩個表,以便在test2每個記錄對應於的test2日期之前發生的最新test1記錄。任何給定的序列都可以在任一表中有多個記錄。

使用上述例子的結果應該是這樣的:

+----------+----------+-----------+----------+-----------+ 
| serial | t2data | t2date | t1data | t1date | 
+----------+----------+-----------+----------+-----------+ 
| a  | ... | 6/05/12 | ... | 6/04/12 | 
| b  | ... | 6/07/12 | ... | 6/06/12 | 
| b  | ... | 6/08/12 | ... | 6/06/12 | 
| a  | ... | 6/09/12 | ... | 6/08/12 | 
+----------+----------+-----------+----------+-----------+ 

這是我試過的查詢,但它不工作。

SELECT 
    t2.serial, t2.t2data, t2.t2date, t1a.t1data, t1a.t1date 
FROM 
    test2 t2 
JOIN 
    test1 t1a ON (t1a.serial = t2.serial AND t1a.t1date > t2.t2date) 
LEFT JOIN 
    test1 t1b ON (t1a.serial = t1b.serial AND t1a.t1date < t1b.t1date) 
WHERE 
    t1b.serial IS NULL 

我可能會在這一切都錯了,但我能做些什麼來做到這一點?

+0

你還沒有定別名「T1」任何表和選擇 – 2013-02-20 03:35:32

+0

@BhavikShah指定是一個錯字。我現在修好了。這不是我所遇到的問題。 – kdh454 2013-02-20 03:42:45

回答

0

我不知道這是否是最好的方法,但它的工作:

SELECT t2.serial, t2.t2data, t1.t1data, t1.t1date 
FROM 
    (SELECT t2.serial, t2.t2data, t2.t2date, 
     (SELECT max(t1date) 
      FROM test1 t1 
      WHERE t1.serial = t2.serial 
      AND t1.t1date <= t2.t2date) AS t1date 
    FROM test2 t2) t2 
    LEFT OUTER JOIN 
    test1 t1 ON t2.serial = t1.serial AND t2.t1date = t1.t1date; 

http://www.sqlfiddle.com/#!2/215c263/2

+0

這確實有效,但似乎應該有更好的方法。我也通過創建帶有連接並加入自身的視圖來實現它。在性能方面,兩家公司的記錄似乎同樣緩慢。 – kdh454 2013-02-23 20:07:48