2015-09-11 2 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-09-04 и меньше, чем 2015-09-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

Вам нужно сгруппировать и использовать HAVING в качестве фильтра для сгруппированных колонок

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_sub и date_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

Thats it! Большое спасибо. – MarkusHH

Смежные вопросы