2012-11-30 5 views
2

J'ai un petit problème de connexion.
Je dois sélectionner deux comptes à partir de la requête J'aime et Collecte mais quand j'ajoute une deuxième requête au lieu de 2 likes and 10 collects, je reçois 10 likes and 10 collects.
Qu'est-ce que je fais mal ici?NUMÉRO multiple dans le numéro de série

select COUNT(tl.ItemLikeId) as a, COUNT(tib.PacketId) as b 
from Items i 
left join ItemLikes il 
on il.ItemId = i.ItemId 
left join ItemsInPackets iip 
on iip.ItemId = i.ItemId 
where i.ItemId = 14591 

Répondre

6

Essayez SELECT COUNT(DISTINCT tl.ItemLikeId) AS a, COUNT(DISTINCT tib.PacketId) as b. Votre jointure vous donne dix lignes, de sorte que vous avez dix ID de chaque table. Cependant, tous les identifiants ne sont pas uniques. Vous recherchez des ID uniques

+0

Oui Je vois mon erreur maintenant. dans ItemInPocket est N: N table. Donc, je n'ai pas ajouté de colonne d'incrémentation automatique. Lorsque j'utilise distinct sur ces touches, cela fonctionne :) – 1110

2

Le nombre renvoie le nombre de lignes. Pas le nombre de lignes avec une valeur, et pas le nombre de lignes distinctes.

Pour obtenir des lignes de numéro de ligne avec une valeur

select SUM(CASE WHEN tl.ItemLikeId IS NOT NULL THEN 1 ELSE 0 END) as a, 
     SUM(CASE WHEN tib.PacketId IS NOT NULL THEN 1 ELSE 0 END) as b 

Pour obtenir le nombre de valeurs distinctes, faites ce que zimdanen suggéré et utiliser COUNT(DISTINCT)

select COUNT(DISTINCT tl.ItemLikeId) as a, COUNT(DISTINCT tib.PacketId) as b 

Une autre approche, si tout ce que vous utilisez ItemLikes et ItemsInPackets pour les chiffres

select 
    (
     SELECT COUNT(ItemLikeId) 
     FROM ItemLikes 
     WHERE ItemId = i.ItemId 
    ) as a, 
    (
     SELECT COUNT(PacketId) 
     FROM ItemsInPackets 
     WHERE ItemId = i.ItemId 
    ) as b 
from Items i 
where i.ItemId = 14591 
+1

En fait, 'COUNT (nomfichier)' vous donnera le nombre de lignes qui ont une valeur pour 'rowname'. 'COUNT (1)' ou 'COUNT (*)' vous donnera un nombre de lignes droites. – zimdanen

+0

@zimdanen Bon appel. J'allais en mémoire, mais j'ai vérifié et vous avez raison. – cadrell0