2017-09-05 101 views
1

我有6個表來存儲我的用戶數據的MySQL從每一個表中獲取用戶最新數據

tbl_user_name

uuid | username | date (unix time) 
----------------------------------------- 
    0 | lisha.s  | 1489857236 
    1 | titami  | 1485853232 
    2 | mathew  | 1442853636 <----|> Users can change their username 
    3 | sandarjun | 1489857239  |> so i need to get the uuid by the 
    2 | mathew_kar | 1575456274 <----|> newest username which is given 

tbl_user_fullname:

uuid | fullname  | date (unix time) 
----------------------------------------- 
    0 | Lisha Simonette | 1489857236 
    1 | Titus Amiran | 1481256345 
    2 | Mathew Karolina | 1489234455 
    3 | Sandhya Arjun | 1489857239 
    0 | Lisha Karolina | 1599999999 

tbl_user_website:

uuid | website | date (unix time) 
----------------------------------------- 
    0 | google.com  | 1489857236 
    1 | titusamiran.com | 1489855234 
    2 | mathewk.net  | 1489857432 
    3 | blod.sandhya.info | 1489857239 

tbl_user_birthdate :

uuid | birthdate | date (unix time) 
----------------------------------------- 
    0 | 02-05-1991 | 1489857236 
    1 | 05-08-1980 | 1489857123 
    2 | 09-09-1992 | 1489851334 
    3 | 17-02-1998 | 1489857239 

tbl_user_follower:

uuid | follower_uuid 
----------------------- 
    0 | 4 
    1 | 8 
    2 | 0 
    3 | 4 
    3 | 2 
    3 | 1 

tbl_user_online:

uuid | last_seen (unix time) 
----------------------- 
    0 | 1489855334 
    1 | 1589851111 
    2 | 1689857234 
    3 | 1789834539 

我想收集的uuid,全名稱,網站,出生日期和追隨者的由用戶與號碼給定的用戶名。 (我需要獲取最新的用戶名uuid,因爲用戶可以更改用戶名)。

日期列是它們更改值時的時間戳。例如在tbl_user_fullname:Lisha Simonette(uuid 0)與Mathew Karolina(uuid 2)結婚,所以我需要在日期列中獲得Lisha(uuid 0)的新名稱。等等......對於tbl_user_websitetbl_user_birthdate ..即使他們不經常改變他們的生日;)

從表tbl_user_online我只需要last_seen時間戳。

我給查詢的值是用戶名。用戶名應該給出與我可以查詢其他表的uuid。

非常感謝您的幫助和抱歉,我的英語不好;)

+0

爲什麼每個表都有與之相關的時間戳?你嘗試過什麼嗎? –

+0

每個表都有一個時間戳,因爲用戶可以更改用戶名和全名等值。所以我需要通過時間戳獲取最新值。 – pfMusk

+0

爲什麼你需要檢索他們的用戶名**使用**雖然?難道你不能只運行一個'UPDATE'而不是追加新行? –

回答

1

下面的查詢將解決提出這樣的問題:

SELECT usr.uuid, 
     ful.fullname, 
     web.website, 
     brt.birthdate, 
     COUNT(fol.follower_uuid) 
    FROM tbl_user_name  usr 
    JOIN tbl_full_name  ful ON ful.uuid = usr.uuid 
    LEFT JOIN     
     tbl_full_name  ful2 ON ful2.uuid = ful.uuid 
           AND ful2.time_stamp > ful.time_stamp 
    JOIN tbl_user_website web ON web.uuid = usr.uuid 
    LEFT JOIN     
     tbl_user_website web2 ON web2.uuid = web.uuid 
           AND web2.time_stamp > web.time_stamp 
    JOIN tbl_user_birthdate brt ON brt.uuid = usr.uuid 
    LEFT JOIN 
     tbl_user_birthdate brt2 ON brt2.uuid = brt.uuid 
           AND brt2.time_stamp > brt.time_stamp 
    JOIN tbl_user_follower fol ON fol.uuid = usr.uuid 
WHERE usr.username = 'jack_2' 
    AND ful2.uuid IS NULL 
    AND web2.uuid IS NULL 
    AND brt2.uuid IS NULL 
GROUP BY 
     usr.uuid, 
     ful.fullname, 
     web.website, 
     brt.birthdate 

此查詢的工作原理是在一個表中分離出的最新時間戳它連續共享一個共同的元素。在這種情況下,uuid。

Here is the fiddle to see it working.

Here is a fiddle without the username filter

您有您需要解決一個更大的問題,但是。你不應該像存儲時間戳那樣存儲值。

我建議你看看table triggers的更新和插入語句。您應該設置一個觸發器,以便自動將條目插入到存儲此信息的審計表中,同時保持核心功能表的小而有序。

例如,創建一個名爲tbl_user_name_audit的表。在tbl_user_name上觸發更新。更新用戶名時,先前的值將插入tbl_user_name_audit表中,其中包含一個前後值以及一個時間戳和審計類型(INSERT/UPDATE/DELETE)。

+0

非常感謝您的幫助!即時通訊新的MySQL。但爲什麼我不能用這個替換'WHERE username = @p_user_name':WHERE username ='myusername'? – pfMusk

+0

現在再試一次。它在TSQL中,現在應該在mySQL中,並且應該讓你改變用戶名。 –

+0

對不起,但我沒有得到任何結果,如果我鍵入一個用戶名存在 – pfMusk

相關問題