2013-10-08 7 views
1

J'ai les tables Suivis sur ma base de donnéesrequête de jointure par date et primaire

database tables

Il y a plusieurs statuts projet (attente, travail, fini, payant) et un projet doivent passer par tous le statut d'attendre à payé. Afin de garder une trace complète du projet, chaque statut est conservé, ainsi nous savons quand un projet a changé son statut.

Je voudrais créer un filtre de recherche avec l'état actuel (celui avec le plus récent « created_at »).

J'ai essayé quelques requêtes afin d'obtenir le résultat correct, mais je suis coincé avec celui-ci.

La requête sans travail que j'ai est

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, cette requête ne fonctionne pas et me retourner chaque projet avec un record pour project_status_id XX sans tenir compte de l'ordre.

Tout indice serait très apprécié!

Merci,
Benjamin

+0

Cela n'a pas besoin d'avoir une table de jointure séparée (projects_status_projects) puisque chaque statut de projet n'appartiendra qu'à un projet (si j'ai bien lu la question). La table project_statuses devrait simplement avoir une colonne project_id. Cela rendrait vos requêtes plus faciles à gérer. – Slicedpan

+0

@Slicedpan, peut-être que ma question n'a pas été correctement expurgée, mais la table project_statuses contient des "status labels" tels que "paid, waiting et ainsi de suite" (cela nous permet d'ajouter un nouveau statut et d'éviter les constantes). Donc la table de jointure est requise – bmichotte

Répondre

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 avec quelques exemples ici: http://sqlfiddle.com/#!2/725fcc/7/0

+0

Pour la requête complète, j'ai dû ajouter 'et project_status_id = XX' Merci pour votre bonne réponse. – bmichotte

0

Voici une façon de le résoudre:

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

La première requête ne donnera pas le résultat –

+0

Vous avez raison, le premier était charabia, donc je l'ai enlevé et gardé seulement le second. –

+0

Retiré le -1 maintenant ... :-) –

0

essayez ceci:

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 

ou

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

Si vous avez juste besoin de l'état actuel du projet

Essayez cette ::

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