2013-10-08 2 views
1

У меня есть таблицы Подписок на моей базе данныхРегистрация запроса по дате и первичной

database tables

Есть несколько проекта статусов (ожидание, работа, закончены, платный) и проект должен пройти через все статус от ожидания до платного.

Чтобы сохранить полную информацию о проекте, каждый статус сохранен, поэтому мы знаем, когда проект изменил его статус.

Я хотел бы создать фильтр поиска а с текущего состояния (тот, с более поздним «created_at»).

Я попробовал несколько запросов, чтобы получить правильный результат, но я застрял в этом.

не-работает запрос у меня есть

select p.* from projects p 
left join projects_status_projects psp on psp.project_id = p.id 
where p.id in (select project_id from projects_status_projects 
     where project_status_id = XX group by project_id order by created_at desc) 

Ofc, этот запрос не работает, и вернуть мне каждые проекты с записью для project_status_id XX, не принимая во внимании порядка.

Любой намек был бы очень признателен!

Спасибо,
Benjamin

+0

Это не нужно иметь отдельную таблицу присоединиться (projects_status_projects), поскольку каждый статус проекта будет принадлежать только одному проекту (если я правильно прочитал вопрос). В таблице project_statuses должен быть просто столбец project_id. Это упростит управление вашими запросами. – Slicedpan

+0

@Slicedpan, может быть, мой вопрос был неправильно отредактирован, но таблица project_statuses содержит «метки статуса», такие как «платные, ожидающие и т. Д.» (Это позволяет нам добавлять новый статус и избегать констант). Таким образом, требуется таблица соединений – bmichotte

ответ

1
select p.* from projects p 
left join projects_status_projects psp on (psp.project_id = p.id) 
where created_at = (select max(created_at) 
        from projects_status_projects where 
        project_id = p.id)   

sqlfiddle с некоторым примером здесь: http://sqlfiddle.com/#!2/725fcc/7/0

+0

Для полного запроса мне пришлось добавить 'и project_status_id = XX' Спасибо за ваш хороший ответ. – bmichotte

0

Вот один из способов ее решения:

select p.* from projects p 
left join projects_status_projects psp on psp.project_id = p.id 
where p.id in (select project_id from projects_status_projects 
     where project_status_id = XX and created_at = min(created_at) group by project_id) 
+0

Первый запрос не даст результата –

+0

Вы правы, первый из них был тарабарщиной, поэтому я удалил его и сохранил только второй. –

+0

Удалено -1 сейчас ... :-) –

0

попробовать это:

select p.* from projects p 
    left join projects_status_projects psp on psp.project_id = p.id 
    where psp.id = (select max(id) from projects_status_projects 
      where projects_status_projects.project_id =p.id) and psp.project_status_id = XX 

или

select p.* from projects p,projects_status_projects psp 
    where psp.project_id = p.id and psp.id = (select max(id) from projects_status_projects 
      where projects_status_projects.project_id =p.id) and psp.project_status_id = XX 
1

Если вам просто нужно текущий статус проекта

Попробуйте ::

Select DITINCT(p.id),p.* 
from projects p 
left join projects_status_projects psp on psp.project_id = p.id 
where project_status_id = XX 
order by created_at desc 
Смежные вопросы