2015-09-11 18 views
1

我需要帮助与MySQL查询。我的表:从加入的表中选择最大值

对象

+---------+--------+ 
| id  | name | 
+---------+--------+ 
| 1 | house 1| 
| 2 | house 2| 
| 3 | house 3| 
+---------+--------+ 

objects_expire

+----------+-----------+ 
| object_id| expire | 
+----------+-----------+ 
| 1  | 2014-09-11| 
| 1  | 2015-09-11| 
| 2  | 2014-09-11| 
| 2  | 2015-09-11| 
| 2  | 2016-09-11| 
| 3  | 2013-09-11| 
| 3  | 2014-09-11| 
| 3  | 2015-09-15| 
+----------+-----------+ 

现在我需要的对象,其中最大 '过期' 是更大然后2015年9月4日和较小然后2015年9月18日(+/- 7日)

像这样的结果:

+----------+-----------+-----------+ 
| object_id| expire | name  | 
+----------+-----------+-----------+ 
| 1  | 2015-09-11| house 1 | 
| 3  | 2015-09-15| house 3 | 
+----------+-----------+-----------+ 

这是我现在有:

SELECT o.id, MAX(uio.expire) AS object_expires 
FROM objects AS o 
LEFT JOIN objects_expire AS oe ON oe.object_id = o.id 
WHERE expire < '2015-09-18' 
AND expires > '2015-09-04' 
GROUP BY o.id 

但那不正确。

感谢您的帮助!

回答

1

您需要组,并使用具有作为过滤器的分组列

select object_id, max(expire) as expire, name 
from objects_expire 
left join objects on objects_expire.object_id=objects.id 
group by object_id, name 
having max(expire) < '2015-09-17' 
and max(expire) > '2015-09-03' 
+0

但我需要从数据表对象:-( – MarkusHH

+0

然后添加一个连接,或编辑你的问题,以反映这一点。你所需的输出并不需要加入的。 – AdrianBR

+0

我已经编辑了我所需的输出。对不起 – MarkusHH

2

一个通常的做法是做分组第一,然后加入回来,如果你还不想硬编码日期,您可以始终使用date_subdate_add函数从当前日期获取-/+ 7 days

select 
o.id, 
e.mexpire as expire, 
o.name 
from objects o 
join(
    select object_id,max(expire) as mexpire 
    from objects_expire 
    group by object_id 
    having mexpire > date_sub(curdate(),interval 7 day) and mexpire < date_add(curdate(),interval 7 day) 
)e 
on o.id = e.object_id 
+0

就是这样!非常感谢你。 – MarkusHH