php - MySQL 从每个表中获取用户的最新数据

标签 php mysql sql database

我有 6 个表来存储我的用户数据

tbl_用户名

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) married Mathew Karolina (uuid 2) 所以我需要在日期栏中获得 Lisha (uuid 0) 的新全名。依此类推...对于 tbl_user_websitetbl_user_birthdate .. 即使他们不经常更改生日 ;)

从表 tbl_user_online 我只需要 last_seen 时间戳。

我给查询的值是用户名。用户名应该给出我可以查询其他表的 uuid。

非常感谢您的帮助,抱歉我的英语不好 ;)

最佳答案

下面的查询将解决所提出的问题:

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

此查询的工作原理是隔离表中的最新时间戳,该表共享一行中的公共(public)元素。在本例中为 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 表中,其中包含之前和之后的值以及时间戳和审计类型(插入/更新/删除)。

关于php - MySQL 从每个表中获取用户的最新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46045922/

相关文章:

php - 在php应用程序中实现基于角色的访问控制

php - 如何将字符串函数应用于表列?

java - JOOQ Oracle 数字精度和 Java 数字映射

php - jQuery 日期选择器不工作 - Laravel 应用程序

php - 如何在 JavaScript 中对字符串进行编码/解码?

php - Joomla - 获取文章 ID 数组、检索文本并链接到它们

mysql - 如何根据多个条件SQL查询来SELECT和Concat()列值?

java - Jasper Dynamic Reports - 使用 jasper reports 生成出现错误的报告

mysql - 将 NULL 插入 MySQL 时间戳

sql - 如何连接上个月缺少行的两个表?