多个可能不同的行(基于日期的最后一行)

时间:2014-05-21 02:48:46

标签: mysql sql

我有三张桌子

图片(TBL):

Pic_id
Pic name

审核(多对多关系)(tbl):

Pic_id
state_id
date(type: datetime)

状态(TBL):

state_id
state_name

我可以为特定的图片设置不同的satate,但是考虑基于日期的最后一个!

我已经尝试过以下方法来查询所有图片(应该是不同的)并显示状态(根据审核表中的日期显示状态),但显然我错了:

SELECT distinct P.pic_id,m.state_id,m.date,st.state_name
FROM Pictures P
 left join moderation m
 on P.pic_id = m.pic_id
  join state st
 on m.state_id = st.state_id
group by P.pic_id
order by m.date ASC

你能告诉我这是正确的方法吗?

如果您需要更多说明,请告诉我们!

Pictures:

pic_id  Pic_name
1   Test1
2   Test2

Moderation:
Pic_id              state_id               date
1           1       2000-01-01  
1           2       2005-01-01
2           2       2000-01-01
2           1       2001-01-01

state:
state_id            state_name
1           accepted    
2           declined

Desired out put:

 P.pic_id,   m.state_id,   m.date,   st.state_name
 1      2        2005-01-01     declined
 2      1        2001-01-01     accepted

1 个答案:

答案 0 :(得分:2)

执行此操作的常用方法是使用max aggregate将表连接回自身。

select P.pic_id, m.state_id, m.date, st.state_name
from Pictures P
  join (select pic_id, max(date) maxdate
        from moderation
        group by pic_id
        ) t ON p.pic_id = t.pic_id
  join moderation m on P.pic_id = m.pic_id and t.maxdate = m.date
  join state st on m.state_id = st.state_id

如果您想要的结果包含所有图片(即使是那些没有状态的图片),那么您需要使用outer join


编辑:如果你担心潜在的关系,这是一次MySQL让它变得容易一点,因为你可以添加一个group by,它将返回一个随机状态:

select P.pic_id, m.state_id, m.date, st.state_name
from Pictures P
  join (select pic_id, max(date) maxdate
        from moderation
        group by pic_id
        ) t ON p.pic_id = t.pic_id
  join moderation m on P.pic_id = m.pic_id and t.maxdate = m.date
  join state st on m.state_id = st.state_id
group by p.pic_id