mysql - 从 2 个联接表中获取 select 语句中每行输出的最新时间戳

标签 mysql select max multiple-tables

我有 3 个表,如下所示。给定特定的成员名称搜索词,我想获取成员名称、ID 的列表,以及每个成员的最新事件时间。

这个“最晚事件时间”是比较 game_record 和 eating_record 表的最晚时间。

所需的输出也在下面给出。

成员(member)信息表:

name     m_id
----     ---- 
john      1
doe       2
johnson   3

游戏记录:

time_of_activity      game_id  m_id
----------------      -------  -----
2013-01-20 23:01:00     1         3
2013-01-20 23:01:07     4         1
2013-01-20 23:01:06     1         2
2013-01-20 23:01:05     3         1

饮食记录:

time_of_activity      food_id  m_id
----------------      -------  -----
2013-01-20 23:01:04     1         1
2013-01-20 23:01:03     4         1
2013-01-20 23:01:02     1         2
2013-01-20 23:01:01     3         3

搜索词为“john”时的期望输出:

name     m_id     latest_time
----     ----     -----------
john      1       2013-01-20 23:01:07
johnson   3       2013-01-20 23:01:01

到目前为止我尝试了什么:

我可以通过以下查询获得前两列:

select name, 
       m_id 
from 
       member_info 
where 
       name like "john%";

我可以通过以下查询获取给定成员的 latest_time,但我不确定如何将第二个查询与第一个查询合并以获得我想要的输出。

select greatest ((select 
                        max(time_of_activity) 
                  from
                      game_record 
                      join 
                          member_info on game_record.m_id = member_info.m_id
                  where member_info.name = "john"),
                 (select 
                        max(time_of_activity) 
                  from
                      eating_record 
                      join 
                          member_info on eating_record.m_id = member_info.m_id
                  where member_info.name = "john"));

用于此的 SQL Fiddle 位于:http://sqlfiddle.com/#!2/b70d0/3

附言表 game_record 和 eating_record 有其他专用于游戏/食物的列,此处未包括在内,因为我想简化和隔离我需要帮助的部分。

谢谢! :)

最佳答案

您可以使用 UNION ALL 查询来获取同一列中的 eating_recordgame_record 时间,然后应用聚合函数来获取最大时间:

select m.name,
  m.m_id,
  max(time_of_activity) latest_time
from member_info m
left join
(
  select time_of_activity, m_id
  from game_record
  union all
  select time_of_activity, m_id
  from eating_record
) g
  on m.m_id = g.m_id
where m.name like 'john%'
group by m.name, m.m_id

参见 SQL Fiddle with Demo .

这也可以在子查询中用聚合来写:

select m.name,
  m.m_id,
  max(time_of_activity) latest_time
from member_info m
left join
(
  select max(time_of_activity) time_of_activity, m_id
  from game_record
  group by m_id
  union all
  select max(time_of_activity) time_of_activity, m_id
  from eating_record
  group by m_id
) g
  on m.m_id = g.m_id
where m.name like 'john%'
group by m.name, m.m_id;

参见 SQL Fiddle with Demo

关于mysql - 从 2 个联接表中获取 select 语句中每行输出的最新时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16345383/

相关文章:

mysql - 在 Jenkins 中使用 docker exec 运行 October artisan 命令时连接被拒绝

java - 这个 MYSQL 查询有什么问题

mysql - UPDATE Ranks in MySql table that has sub-categorys with one 语句

javascript - 获取选择标签的当前值

tsql - SQL从表中选择最大值

c++ - 查找列 'k' 右侧的最大元素

php - % _ 在搜索表单中显示所有结果

php - MYSQL 选择查询返回不期望的结果

mysql - 当查询有 order by 子句时,复杂的 sql 运行速度极慢

mysql - 一列中的 SQL 最大值