2012-09-21 47 views
1

我有兩個表,表示歷史數據,他們都有一個「src」列,表示該數據主表中的主鍵。我的SQL查詢找到與匹配的主鍵最大值<=日期

例如

的主表將是

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的電子郵件記錄,你改變從[email protected]電子郵件給[email protected],然後再[email protected]

您tbl_email_hist應該是這樣的

email_pk  src_email_pk  email    tstamp 
1     1   [email protected]  2012-01-01 04:06:28 
2     1   [email protected]  2012-03-01 04:06:28 
3     1   [email protected]  2012-07-01 04:06:28 

並讓說,鮑勃原來的用戶名是rsmith,然後又改爲BSMITH然後回到rsmith2。但是這些用戶名稱的更改並不一定與電子郵件更改的時間戳一致。

SO同樣的用戶履歷表看起來像

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記錄來查找正確的電子郵件歷史記錄......這意味着用戶記錄更改時該字段的價值。 因此,在某些方面,我需要找到電子郵件hist表中的記錄,其中src_email_pk與用戶hist表中的email_pk匹配,但該電子郵件歷史記錄的tstamp是最高日期,但仍爲< =用戶表中的時間戳。

在結束我的數據是這樣的

Username  email    username_timestamp 
Rsmith  [email protected]  2012-01-01 04:08:28 
Bsmith  [email protected] 2012-02-01 04:01:28 
Rsmith2  [email protected] 2012-05-01 04:05:28 

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

回答

0

剛剛意識到我從來不回答這個question..the上述建議的答案不會的工作,你得到一個錯誤有關的節有一個限制的語句,雖然我認爲它的IN導致問題。

這下面的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 
0

你可以嘗試這樣的事情:

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 
) 
+0

此查詢優化似乎不好解決了這個問題。 – endyourif

+0

它是。但是,只有一個查詢才能做到這一點的好方法是通過改變數據庫模式的非規格化數據,並將tkl_user_hist中的fk存儲到tbl_user_hist。 – 2012-09-24 07:44:41

相關問題