2

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

这个“最新活动时间”是比较 game_record 和 eat_record 表的最晚时间。

下面还给出了所需的输出。

成员信息表:

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

到目前为止我已经尝试过:

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

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

PS 表 game_record 和 eating_record 有其他特定于游戏/食物的列,这里没有包括,因为我想简化和隔离我需要帮助的部分。

谢谢!:)

4

2 回答 2

1

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

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

于 2013-05-02T19:01:08.057 回答
0

我的解决方案是按会员 ID 汇总每个表(游戏和饮食)以获得最新时间。然后,将它们连接在一起并使用该greatest()函数获取最新时间:

select mi.*, greatest(gr.maxtime, er.maxtime) as latest_time
from member_info mi left outer join
     (select m_id, MAX(time_of_activity) as maxtime
      from game_record gr
      group by m_id
     ) gr
     on gr.m_id = mi.m_id left outer join
     (select m_id, MAX(time_of_activity) as maxtime
      from eating_record er
      group by m_id
     ) er
     on er.m_id = mi.m_id
于 2013-05-02T19:00:31.460 回答