簡體   English   中英

我的SQL查詢以找到具有匹配主鍵的最大<=日期

[英]My SQL query to find the max <= date with a matching primary key

我有兩個表代表一個歷史數據,它們兩個都有一個“ src”列,該列代表該數據的主表中的主鍵。

例如

主表將是

tbl_user        tbl_email
________        _________
user_pk         email_pk
username        email
email_pk        tstamp
tstamp

歷史記錄表基本上將原始表與“ src”列匹配,該列指示來自主表的源主鍵記錄。

tbl_user_hist                 tbl_email_hist
______________                ______________
user_pk                       email_pk
src_user_pk                   src_email_pk
username                      email
email_pk                      tstamp
tstamp                      

因此,如果您有主鍵1的電子郵件記錄,並且將電子郵件從bob@gmail.com更改為bob@hotmail.com,然后又將其更改為bob@yahoo.com

您的tbl_email_hist看起來像這樣

email_pk     src_email_pk     email                tstamp
1                   1         bob@gmail.com        2012-01-01 04:06:28
2                   1         bob@hotmail.com      2012-03-01 04:06:28
3                   1         bob@yahoo.com        2012-07-01 04:06:28

可以說,bobs的原始用戶名是rsmith,然后將其更改為bsmith,然后又更改為rsmith2。 但是,這些用戶名更改不一定與電子郵件更改的時間戳一致。

所以類似的用戶歷史記錄表看起來像

tbl_user_hist
User_pk     src_user_pk     username    email_pk      tstamp
1           1               rsmith      1             2012-01-01 04:08:28
2           1               bsmith      1             2012-02-01 04:01:28
3           1               rsmith2     1             2012-05-01 04:05:28

因此,我想創建一個查詢,該查詢將能夠基於時間戳和相關的email_pk記錄找到正確的電子郵件歷史記錄……這意味着在更改用戶記錄時該字段的值是多少。 因此,我需要以某種方式在電子郵件歷史記錄表中找到src_email_pk與用戶歷史記錄表中的email_pk匹配的記錄,但是該電子郵件歷史記錄的tstamp是最高日期,而仍然<= user表中的時間戳。

最后我的數據看起來像這樣

Username     email              username_timestamp
Rsmith       bob@gmail.com      2012-01-01 04:08:28
Bsmith       bob@hotmail.com    2012-02-01 04:01:28
Rsmith2      bob@hotmail.com    2012-05-01 04:05:28

換句話說,反映在修改/創建用戶名記錄時電子郵件列的值。

您可以嘗試如下操作:

SELECT username, email, tbl_user_hist.tstamp
FROM tbl_user_hist 
INNER JOIN tbl_email_hist AS tbl_email_hist1 ON tbl_user_hist.email_pk = tbl_email_hist1.src_email_pk 
WHERE src_user_pk = 1
AND tbl_email_hist1.email_pk IN (
    SELECT tbl_email_hist2.email_pk FROM tbl_email_hist2
    WHERE tbl_user_hist.email_pk = tbl_email_hist2.src_email_pk
    AND tbl_email_hist2.tstamp <= tbl_user_hist.tstamp
    ORDER BY tbl_email_hist2.tstamp DESC
    LIMIT 1
)

剛剛意識到我從未回答過這個問題。.上面建議的答案將不起作用盡管我認為它的IN引起了問題,但您在子句中使用Limit語句卻遇到了錯誤。

下面的sql語句解決了MySQL中的問題

        Select u.username,
        (Select email
        FROM
        (SELECT tbl_user_hist.src_user_pk, tbl_user_hist.username, tbl_email_hist.email,
        tbl_email_hist.src_email_pk, tbl_email_hist.tstamp, tbl_user_hist.user_pk
        FROM  tbl_email_hist 
        INNER JOIN
        tbl_user_hist ON tbl_email_hist.src_email_pk = tbl_user_hist.email_pk AND
        tbl_email_hist.src_email_pk = tbl_user_hist.email_pk AND 
                              tbl_email_hist.tstamp <= tbl_user_hist.tstamp) as e
        where e.user_pk = u.user_pk ORDER BY e.tstamp desc Limit 1) as email,
        u.tstamp as username_tstamp 

        from tbl_user_hist as u

暫無
暫無

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

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