2010-06-08 5 views
0

Je suis en train de trouver toutes les informations traite ainsi que le nombre de commentaires qu'ils ont reçu. Ma requêteMysql SQL JOIN question

select deals.*, 
     count(comments.comments_id) as counts 
from deals 
left join comments on comments.deal_id=deals.deal_id 
    where cancelled='N' 

Mais maintenant il montre seulement les offres qui ont au moins un commentaire. Quel est le problème?

+0

Vous êtes tombé en proie à la non-standard de MySQL « fonctionnalité » en ce qui concerne la clause 'GROUP BY' - toute autre base de données vous dira que vous avez utilisé une syntaxe incorrecte: http://dev.mysql.com/doc/refman/5.0/ fr/group-by-hidden-columns.html –

Répondre

2

Vous avez manqué GROUP BY

select deals.*, count(comments.comments_id) as counts 
from deals 
left join comments on comments.deal_id=deals.deal_id 
where cancelled='N' 
GROUP BY deals.deal_id 
+0

Fonctionne. Merci beaucoup. Mais pourquoi faut-il GROUPER – lonelyloner

+1

La fonction agrégat ('count' dans ce cas) est appliquée à un groupe. Le groupe est défini dans la clause GROUP BY. Pour autant que je me souvienne, SQL standard exige que toutes les colonnes non agrégées dans SELECT apparaissent dans GROUP BY (dans votre cas, vous devrez ajouter GROUP BY deals.deal_id, deals.field2, ... deals.field_N). Cependant, l'extension Mysql ignore cette exigence (il y a une bonne raison à cela dans certains cas). Si vous avez utilisé un serveur SQL différent, vous obtiendrez probablement une erreur au lieu de résultats inattendus. – a1ex07

+0

groupe par des agrégats le compte à chaque transaction - sinon vous obtiendrez un grand total – Randy

0

Essayez de changer left join à right outer join

+1

La jointure gauche ne peut pas être interne. C'est toujours EXTÉRIEUR. – a1ex07

0

'annulés' une colonne de commentaires? Si oui, vous devez déplacer « annulé = « N » » de la clause WHERE à la clause ON (from deals left join comments on comments.deal_id = deals.deal_id AND comments.cancelled='N') ou faire le filtrage dans une vue en ligne (from deals left join (select * from comments where cancelled='N') commentaires sur comments.deal_id = deals.deal_id) depuis le filtrage en la clause where supprimera toutes les lignes où annulé est null.