2013-05-02 61 views
2

我有3个表,如下所示。给定一个特定的成员名称搜索术语,我想获取成员名称的列表,以及每个成员名称的最新活动时间。从选择语句中的每行输出的2个连接表中获取最新时间戳

“最新活动时间”是比较game_record和eating_record表格的最新时间。

期望的输出也在下面给出。

member_info表:

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

game_record:

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 

eating_record:

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 

所需的输出时搜索项是 '约翰':

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捣鼓这个,请访问:http://sqlfiddle.com/#!2/b70d0/3

附:表game_record和eating_record还有其他专栏,这些专栏并不包含在这里,因为我想简化和隔离需要帮助的部分。

谢谢! :)

+1

这将是我们更容易帮助你,如果你设置了[SQL小提琴(HTTP:// sqlfiddle.com/) – 2013-05-02 18:40:14

+0

谢谢,我已将它添加到问题! – Yoga 2013-05-02 19:16:02

回答

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 with Demo

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 
相关问题