mysql - 多对多不同行(基于日期的最后一行)

标签 mysql sql

我有三张 table

图片(表):

Pic_id
Pic name

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

Pic_id
state_id
date(type: datetime)

状态(表):

state_id
state_name

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

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

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

最佳答案

执行此操作的常见方法是使用最大聚合将表连接回其自身。

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

如果您想要的结果包括所有图片(即使是没有状态的图片),那么您需要使用外连接

<小时/>

编辑:如果您担心潜在的联系,这是 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

关于mysql - 多对多不同行(基于日期的最后一行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23773168/

相关文章:

mysql - 改进由许多子查询构建的查询

sql - 过去一年的 Postgresql 当前日期时间

mysql - mysql/sas 或 proc sql 中的分钟间隔

mysql - 尝试在 MySQL 中选择 2 个联合字段作为一个字段

mysql - 如何将电子邮件插入到另一个表而不重复

mysql - 使用 DISTINCT 时发生了什么?

SQL - 更新查询只更新一个字段

sql - 如何让 NHibernate 只生成 SQL 而不执行它?

mysql - 首先 Group By 按顺序检索所有行?

mysql - SQL查询以根据一个值获取特定行