2013-05-02 15 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 
相關問題