2011-04-13 3 views
0

J'ai quatre tables avec la structure suivante:requête qui compte les commentaires pour chaque membre du panel

  1. panelists (panelist_id, first_name, last_name, etc.)
  2. projects (project_id, title, created_date, etc.)
  3. panelists_on_projects (pp_id, panelist_id, project_id, etc.)
  4. comments (comment_id, panelist_id, project_id, etc.)

Imaginez que j'ont quatre panélistes sur le même projet ("x"), mais seulement 3 des membres du panel ont laissé un commentaire. J'essaie de trouver une requête qui compte les commentaires pour chaque panéliste et renvoie un zéro pour le panéliste attaché au projet x, mais qui n'a pas laissé de commentaire.

J'ai essayé d'utiliser les éléments suivants:

SELECT first_name, last_name, COUNT(comment_id) 
from panelists 
INNER JOIN comments USING (panelist_id) 
WHERE project = x 

Mais je reçois que des résultats pour les 3 membres du panel qui ont en fait laissé un commentaire. Aucune suggestion?

+0

S'il vous plaît toujours mentionner que DB que vous utilisez. SQL varie considérablement entre eux; Par exemple, SQL Server a de nombreuses possibilités non disponibles dans MySQL (et vice versa). –

+0

Compris. Merci pour la suggestion. JL –

Répondre

2

Le outer join est la partie clé, aussi je pense que vous avez oublié le projet dans la jointure des commentaires. Lorsque vous comptez par une colonne spécifique, les valeurs nulles ne seront pas comptées.

select 
    pj.project_id, 
    p.panelist_id, 
    p.firstname, 
    p.lastname, 
    totalcomments = count(c.comment_id) 
from 
    project pj 
    inner join panelists_on_projects pop on pop.project_id = pj.project_id 
    inner join panelist p on p.panelist_id = pop.panelist_id 
    left outer join comments c on 
     c.panelist_id = p.panelist_id 
     and c.project_id = pj.project_id 
where 
    pj.title = 'X' 
group by 
    pj.project_id, 
    p.panelist_id, 
    p.firstname, 
    p.lastname 
+0

La deuxième condition sur la jointure des commentaires n'est pas nécessaire car vous serez déjà limité à un projet par le raffinement du titre dans la clause where. – tgandrews

+1

@tgandrews Pas vrai. La clause where sélectionne uniquement la ligne correcte dans la table de projet, elle ne filtre pas les commentaires de quelque manière que ce soit sans la deuxième condition de jointure. Le demandeur ne veut pas que les commentaires pour d'autres projets soient comptés. –

+0

@Aleksi - Oui, vous avez raison. J'ai changé par réponse pour être aussi correct que le vôtre. – tgandrews

0

Voici ma mise en œuvre. Bien que vous connaissiez le project_id, vous pouvez aller directement à la table panelists_on_projects.

select 
    pan.first_name 
    , pan.last_name 
    , count(com.comment_id) 
from 
    projects proj 
    inner join panelists_on_project pop 
     on proj.panelist_id = pop.panelist_id 
    inner join panelist pan 
     on pop.panelist_id = pan.panelist_id 
    left outer join comments com 
     on pan.panelist_id = com.panelist_id 
     and com.project_id = proj.project_id 
where 
    proj.title = 'x' 
group by 
    pan.first_name 
    , pan.last_name 

Sans la 2ème état and com.project_id = proj.project_id sur les commentaires rejoindre ce serait le compte du nombre total de commentaires pour tous les projets des panélistes qui étaient sur le projet « x »

+0

Merci tg. J'apprécie votre aide. –

0
SELECT P.first_name, P.last_name, COUNT(C.comment_id) 

FROM panelists as P 

LEFT JOIN panelists_on_projects AS PP ON PP.panelist_id = P.panelist_id 

LEFT JOIN projects AS PR PN PP.project_id = PR.project_id 

LEFT OUTER JOIN comments As C ON C.panelist_id = P.panelist_id AND C.project_id = PR.project_id 

WHERE PR.title = "x" 
+0

Merci SyntaxGoonoo –

Questions connexes