2010-08-01 5 views
2

Je sais que ce sujet a déjà été abordé ici mais j'ai besoin d'un résultat différent pour les autres questions.MYSQL - limitant les jointures

Je dois commander quelques résultats sur le nom de l'institution et ensuite le nom de famille des candidats.

SELECT DISTINCT candidates.*, histories.job_title, institutions.name 
FROM candidates 
JOIN histories ON histories.candidate_id = candidates.id 
JOIN institutions ON histories.institution_id = institutions.id 
WHERE candidates.id IN (1,3,4,6) 
ORDER BY institutions.name, candidates.last_name; 

Mon problème est en ce moment retournera tous les candidats ont rejoint l'histoire (là des emplois actuels/passé) mais si j'ajoute

AND histories.finish_date IS NULL 

Au où il ne reviendra pas les candidats qui ne le font pas avoir un historique ou avoir une date de fin définie.

Merci, Alex

Sous la requête

SELECT DISTINCT candidates.*, 
    (SELECT institution_id 
     FROM histories 
     WHERE histories.candidate_id = candidates.id AND histories.finish_date IS NULL 
     LIMIT 1) AS job_title  
    FROM candidates 
    JOIN institutions ON histories.institution_id = institutions.id 
WHERE candidates.id IN (1,3,4,6) 
+0

Alex: J'ai réalisé après avoir posté ma suggestion qu'il y avait des problèmes, et je l'ai donc supprimé. Désolé d'avoir pris votre temps. –

Répondre

0

Essayez d'utiliser une jointure gauche sur la table des histoires:

SELECT DISTINCT candidates.*, histories.job_title, institutions.name 
FROM candidates 
LEFT JOIN histories ON histories.candidate_id = candidates.id AND histories.finish_date IS NULL 
JOIN institutions ON histories.institution_id = institutions.id 
WHERE candidates.id IN (1,3,4,6) 
ORDER BY institutions.name, candidates.last_name; 

Je ne peux pas vérifier cela, vous aurez à faire pour moi. Il devrait retourner tous les candidats, et leurs histoires (s'ils en ont un).

+0

Merci, cela a retourné 3 des 4, mais le quatrième a une date de fin définie, c'est-à-dire qu'il n'est actuellement pas employé. comment pourrais-je l'inclure aussi? – Alex

+0

@Alex essayer ma version modifiée, sans la clause AND. –

+0

Merci, je ne pense pas que je l'ai très bien expliqué. Je veux seulement renvoyer les 4 candidats avec le plus d'histoire renvoyé (finish_date mis à null) mais dans certains cas le candidat peut ne pas avoir d'historique mais ils devraient toujours être retournés – Alex

Questions connexes