我有三张桌子
图片(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
答案 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