簡體   English   中英

MySQL JOIN 基於最高日期和非唯一列

[英]MySQL JOIN based on highest date and non-unique columns

我需要一些關於我正在處理的 MySQL 查詢的幫助。 我有如下數據。

表格1

id   date1        text     number
---|------------|--------|-------
1  | 2012-12-12 | hi     | 399 
2  | 2011-11-11 | so     | 399
5  | 2010-10-10 | what   | 555
3  | 2009-09-09 | bye    | 300
4  | 2008-08-08 | you    | 300

表 2

id   number   date2        ref
---|--------|------------|----
1  | 399    | 2012-06-06 | 40
2  | 399    | 2011-06-06 | 50
5  | 555    | 2011-03-03 | 60

對於表 1 中的每一行,我想從表 2 中獲取零個或一個參考值。表 1 中的每一行的結果中都應該有一行。數字列對於任一表都不是唯一的,因此連接必須使用 date1 & date2 列進行,其中 date2 是該數字的最大值,但不超過該數字的 date1。

上述示例的預期結果將是這樣的。

 date1        text     number   ref
------------|--------|--------|-----
 2012-12-12 | hi     | 399    | 40
 2011-11-11 | so     | 399    | 50
 2010-10-10 | what   | 555    | null
 2009-09-09 | bye    | 300    | null
 2008-08-08 | you    | 300    | null

您可以在結果的第一行中看到,選擇了 ref is 40,因為在 table2 中,ref=40 的記錄有一個小於 date1 的 date2,以及滿足該條件的最高日期。 在結果的第二行中,選擇了 ref 為 50,因為在 table2 中,ref=50 的記錄的 date2 小於 date1,並且是滿足該條件的最高日期。 結果的 rest 具有 null 參考,因為 date1 始終小於或 table2 中不存在相應的數字。

我已經到了某個點,但我被卡住了。 到目前為止我的查詢是這樣的。

SELECT date1, text, number, ref
FROM table1
LEFT JOIN (
    SELECT * 
    FROM (
        SELECT * 
        FROM table2
        WHERE date2 <= '2012-12-12'
        ORDER BY date2 DESC
    ) tmp 
    GROUP BY msisdn
) tmp ON table1.number = table2.number;

問題是硬編碼日期不行,它應該基於date1,但我不能使用date1,因為它在外部查詢中。 有沒有辦法讓這個工作?

我剛才用不同的表嘗試了類似的例子,並且能夠得到你想要的。 以下是修改后的類似查詢以滿足您的需求。 如果那是您要查找的內容,您可能想用<=更改<

SELECT a.date1, a.text, b.ref
FROM table1 a LEFT JOIN table2 b ON 
                        ( a.number = b.number
                          AND  a.date1 > b.date2 
                          AND b.date2 = ( SELECT MAX(x.date2) 
                                          FROM table2 x 
                                          WHERE x.number = b.number 
                                             AND x.date2 < a.date1)
                        )

未經測試:

SELECT t1.date1, 
       t1.text,
       t1.number,
       (SELECT a.ref
          FROM TABLE_2 a
          JOIN (SELECT t.number,
                       MAX(t.date2) AS max_date
                  FROM TABLE_2 t
                 WHERE t.number = t1.number
                   AND t.date2 <= t1.date1
              GROUP BY t.number) b ON b.number = a.number
                                  AND b.max_date = a.date2)
  FROM TABLE_1 t1

問題是在子選擇的派生表中使用t1 ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM