[英]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.