2010-03-18 2 views
0

faire un outil pour suivre les appels aux représentants maison/Sénat, et j'ai 2 tables d'importance ici:JOIN dans SQL avec je suis l'un à-plusieurs

représentants

rep_id 
rep_name # and more info 

commentaires

rep_id 
status # enum about result of contact 
comment 

Je veux interroger pour tous reps se joindre à la plus récente associée comments et dans certains cas, joindre comments d'un status spécifique, mais il pourrait y avoir aucun comments associé à ce rep encore.

MERCI!

Répondre

4

vous avez besoin d'une certaine façon de distinguer le dernier commentaire, je fait une nouvelle colonne: comments.commentDate, avec cela ou une auto numéro/identité utiliser une requête comme ceci:

SELECT 
    r.*,c.* 
    FROM reps r 
     LEFT OUTER JOIN (SELECT 
          rep_id,MAX(commentDate) AS MaxDate 
          FROM comments 
          GROUP BY rep_id 
         ) m On r.rep_id=m.rep_id 
     LEFT OUTER JOIN comments c ON r.rep_id=c.rep_id AND m.MaxDate=c.commentDate 
    ORDER BY r.rep_name 
+0

KM, pouvez-vous ajouter m.comments au premier SELECT, ajouter des commentaires à la sous-requête et à la table dérivée, et ignorer la troisième jointure? –

+1

@Marcus Adams, No. La table dérivée "M" trouve la dernière ligne de commentaire par rep. Une fois que vous avez trouvé cette ligne max, vous devez rejoindre la même table pour obtenir les colonnes restantes. Lorsque vous travaillez avec GROUP BY, les seules colonnes qui peuvent apparaître dans la liste de sélection sont les colonnes à regrouper et les fonctions d'agrégation (fonctions qui combinent des lignes). En groupant par rep_id, vous obtenez une ligne par rep_id. Si vous essayez de grouper par le rep_id et le commentaire, vous obtenez une ligne pour chaque rep_id et un commentaire (ce qui sera beaucoup pour un seul rep_id). –

+0

@KM, Oh oui, vous avez raison. Je ne sais pas ce que je pensais. –

1

EDIT:

Utilisez une jointure gauche pour obtenir tous les représentants,

SELECT reps.rep_id, comments.comment 
FROM reps 
LEFT JOIN comments 
ON reps.rep_id=comments.rep_id 
+0

OP veut que tous les représentants, et pas seulement ceux qui ont des commentaires –

+0

Désolé, mal lu la question. KM, votre solution semble sur place dans ce cas. –

+0

oui Je devais le lire plusieurs fois moi-même ... votre dernière édition montre maintenant tous les représentants avec tous leurs commentaires, pas seulement une rangée par représentant avec le dernier commentaire. –