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