1

履歴データを表す2つのテーブルがあり、どちらにもそのデータのプライマリテーブルの主キーを表す「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と一致する電子メール履歴テーブルのレコードを見つける必要がありますが、その電子メール履歴レコードのスタンプは、ユーザーテーブルのタイムスタンプ未満であるにもかかわらず最高の日付です。

結局、私のデータは次のようになります

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

つまり、ユーザー名レコードが変更/作成されたときの電子メール列の値を反映しています。

4

2 に答える 2

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
)
于 2012-09-23T17:37:04.067 に答える
0

私はこの質問に答えたことがないことに気づきました。上記の提案された答えは機能しません。問題を引き起こしているのは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
于 2014-09-04T19:27:41.027 に答える