在mySQL中,如何为多个表中的每个客户端ID选择最新的时间戳?

时间:2015-02-17 12:32:14

标签: mysql sql select

我的数据库中有各种表,每个表对应一种特定类型的消息。各种客户端定期将消息保存到数据库,但根据发生的情况,他们可能会将消息或消息保存到一个或多个表中。共有4张桌子 每个表的格式如下:

client_id | time_stamp | var1 | var2 | var3 | ...

其中client_idVARCHAR字段,time_stamp是格式为TIMESTAMP的SQL YYYY-MM-DD hh:mm:ss。每个表的var都不同。

还有一个客户表,其中包含有关客户端的详细信息:

id | name | type | etc....

消息表上的client_id对应于客户端表上的idid也是客户端表的主键。

我想查询数据库,找到所有表中每个客户端的最新time_stamp。因此,在我的搜索结果中,我应该会在上次与服务器联系时获得client_idtime_stamp的列表,如下所示:

id | time_stamp
1  |  12/2/15...
2  |  11/2/15...
...etc  

我以为我可以通过加入来做到这一点,但现在我明白情况并非如此。我的加入声明为每个表格中的每个client_id提供了time_stamp和一列;因此,它只为已向所有表保存至少一条消息的客户返回了一行 所以我在这里显然不合时宜。 谁能帮我吗?

我的错误SQL语句如下:

SELECT clients.id
     , msg_type_1.time_stamp
     , msg_type_2.time_stamp
     , msg_type_3.time_stamp
     , msg_type_4.time_stamp 
  FROM devices 
  JOIN msg_type_1 
    ON msg_type_1.client_id = clients.id 
  JOIN msg_type_2 
    ON msg_type_2.client_id = clients.id 
  JOIN msg_type_3 
    ON msg_type_3.client_id = clients.id 
  JOIN msg_type_4 
    ON msg_type_4.client_id = clients.id 
 GROUP 
    BY id

1 个答案:

答案 0 :(得分:2)

select client_id, max(time_stamp)
from 
  (select client_id, max(time_stamp) as time_stamp
  from table 1
  group by client_id
  union
  select client_id, max(time_stamp) as time_stamp
  from table 2
  group by client_id
  union
  select client_id, max(time_stamp) as time_stamp
  from table 3
  group by client_id
  union
  select client_id, max(time_stamp) as time_stamp
  from table 4
 group by client_id)
group by client_id