9
votes

Compte SQL () / JOIN DE GAUCHE?

J'ai trois tables: appels, pièces jointes et notes et je souhaite tout afficher dans la table d'appels, mais affichez également si un appel a des pièces jointes et si l'appel a des notes. - en déterminant s'il y a une pièce jointe ou un enregistrement de note avec un appel_id. Il pourrait y avoir des notes et des pièces jointes, ou il peut ne pas y avoir, mais j'aurais besoin de savoir.

Tables Structure: P>

Appels: P>

SELECT c.call_id
     , title
     , description
     , count(attach_id) 
FROM calls c 
LEFT JOIN attachments a ON c.call_id = a.call_id 
GROUP BY c.call_id
       , title
       , description


0 commentaires

6 Réponses :


19
votes

pour le compte xxx

ou pour l'existence (sera plus efficace si c'est tout ce dont vous avez besoin) xxx


7 commentaires

Ne serait-il même pas plus rapide lorsque vous sélectionneriez une clé primaire dans existez () instruction au lieu de toutes les colonnes * ?


@Robert - Non. C'est un mythe.


@Martin: Mais c'est une très bonne pratique, surtout si vous utilisez EF du côté du client où il fait une énorme différence .


Hé, toutes les bonnes réponses les gars. Celui-ci a été publié en premier et je vais aller avec votre efficacité ici Martin - mais je vais utiliser la clé principale de Robert a mentionné. Merci les gars.


oh et devait le changer à "où n.call_id = c.call_id"


@ROBERT - Je n'ai pas utilisé EF alors n'avez absolument aucune idée de la raison pour laquelle il devrait faire une différence. Dans un examen d'existence, il n'y a absolument aucune différence si vous utilisez SELECT 1 , Sélectionnez NULL , SELECT * ou Sélectionnez PK cependant.


@Martin: Tu as raison. J'ai eu ces problèmes avec Orderby + Skip + Prendre la pagination avec tout le nombre d'articles dans EF. Vous pouvez regarder ici et voir ce que je parle de. Stackoverflow.com/Questtions/2493900/... bien qu'il n'a pas grand-chose à faire avec les choses écrites ici.



1
votes
SELECT c.call_id, title, description, a.call_id, n.call_id
FROM calls c 
LEFT JOIN attachments a ON c.call_id = a.call_id 
LEFT JOIN notes n ON c.call_id = n.call_id
GROUP BY c.call_id,title,description, a.call_id, n.call_id
If call id is present in fiels 4 or 5, you know you have an attachement or a noteIf you need to number of attachement or note, look at other answers, look at AtaTheDev's post.

0 commentaires

0
votes

Utilisez distinct code> dans les comptes

Vous devez utiliser des comptes distincts car vos groupes ont grandi par deux entités différentes. Donc, vous devez seulement compter des valeurs distinctes de chacun. Cette requête suivante reviendra à la fois des comptes ainsi que des valeurs bit code> s'il existe des pièces jointes et des notes. P>

select
    c.call_id, c.title, c.description,
    count(distinct a.attach_id) as attachments_count,
    count(distinct n.note_id) as notes_count,
    /* add these two if you need to */
    case when count(distinct a.attach_id) > 0 then 1 else 0 end as has_attachments,
    case when count(distinct n.note_id) > 0 then 1 else 0 end as has_notes
from calls c
    left join attachments a
    on (a.call_id = c.call_id)
    left join notes n
    on (n.call_id = c.call_id)
group by c.call_id, c.title, c.description


1 commentaires

Personne votée Cette baisse devrait fournir un commentaire. Je ne vois pas pourquoi ma réponse n'est pas correcte?



0
votes

Je pense que ça devrait être quelque chose comme ça

Sélectionnez C.Call_ID, Titre, Description, Nombre (Attach_Id distinct), Compte (Note_Id distincte)
Des appels C
Joindre des pièces jointes A sur C.Call_id = A.CALL_ID
Notes de jointure gauche n sur n.call_id = a.call_id

Groupe par c.call_id, titre, description


0 commentaires

0
votes

Cela fonctionne également:

SELECT 
    cl.*,
    (SELECT count(1) FROM attachments AS at WHERE at.call_id = cl.id) as num_attachments,
    (SELECT count(1) FROM notes AS nt WHERE nt.call_id = cl.id) as num_notes,
FROM calls AS cl


0 commentaires

0
votes

J'ai utilisé cette requête simple. Cette requête vous permet d'utiliser facilement des colonnes de tables principales sans groupe par.

   Select StudentName,FatherName,MotherName,DOB,t.count  from Student
   left JOIN
   (
    Select StudentAttendance.StudentID,  count(IsPresent) as count 
    from StudentAttendance
    group by StudentID, IsPresent
   ) as t    
  ON   t.StudentID=Student.StudentID


0 commentaires