10
votes

Deux comptes avec des jointures gauche sont multipliées

J'essaie d'obtenir une requête qui me donne les noms d'utilisateur à partir des utilisateurs de table, le nombre d'emplois proposés à partir de Table Job2User et le nombre d'endroits que l'utilisateur a à partir de la table2User.

La requête suivante continue Multiplier la valeur des deux colonnes de comptage. Par exemple, si pour l'utilisateur 1, le nombre d'emplois doit être 2 et le nombre de places doit être 4, les deux colonnes de l'utilisateur 1 ligne afficheront "8". Je ne sais pas ce que je fais mal: xxx


0 commentaires

5 Réponses :


27
votes

Vous devez utiliser compter (distinct ...) pour compter des valeurs uniques. Au lieu de compter l'ID utilisateur (la clé étrangère) compte la clé primaire de la table référencée.

Voir le docs ici

Vous obtenez huit parce que vous retournez 2 enregistrements d'emplois et 4 des endroits. Puisque vous ne comptez pas de valeurs distinctes, vous obtenez 2 * 4 = 8.


0 commentaires

0
votes

Une option est d'utiliser des vues inline pour chaque table que vous souhaitez compter

SELECT `UserName`, `Job2User`.`Job2UserCount`, `Place2User`.`Place2UserCount`
FROM `Users`
 ` 
LEFT JOIN
(SELECT

 COUNT(`Job2User`.`UserID`) Job2UserCount ,
 UserID
FROM
 Job2User
 GROUP BY 
  `UserID` )Job2User
ON `Job2User`.`UserID`=`Users`.`UserID
LEFT JOIN
(SELECT

 COUNT(`Place2User`.`UserID`) Place2UserCount,
 UserID
FROM
 Job2User
 GROUP BY 
  `UserID` )Place2User
ON `Place2User`.`UserID`=`Users`.`UserID` 
GROUP BY `UserName`; 


0 commentaires

2
votes

Votre problème est probable que vous n'ayez pas la cartographie des tables de Place2User et Job2Uners, vous préformez ainsi une jointure croisée. Plus d'informations sur Cross Joinages

Vous devrez utiliser des requêtes internes Pour y parvenir, sauf si vous les deux tables place2User se rapporte au travail2Utilisateur d'une manière ou d'une autre. p>

Essayez ceci: p>

SELECT `UserName`, `Job2User`.`Count`, `Place2User`.`Count` 
FROM `Users`
LEFT JOIN (SELECT `UserID`, COUNT(1) AS 'Count' FROM `Job2User` GROUP BY `UserID`) `Job2User` ON `Job2User`.`UserID`=`Users`.`UserID` 
LEFT JOIN (SELECT `UserID`, COUNT(1) AS 'Count' FROM `Place2User` GROUP BY `UserID`) `Place2User` ON `Place2User`.`UserID`=`Users`.`UserID` 


0 commentaires

0
votes

Le premier problème que je vois est que vous avez les jointures à l'envers. Vous faites des jointures à gauche, mais la table des utilisateurs est à droite de celle-ci. Vous devez changer cela comme si:

SELECT UserName, 
  (SELECT COUNT(Job2User.UserID) 
   FROM Job2User 
   WHERE Job2User.UserID = t.UserID) AS Job2UserCount,
  (SELECT COUNT(Place2User.UserID) 
   FROM Place2User 
   WHERE Place2User.UserID = t.UserID) AS Place2UserCount
FROM Users AS t


0 commentaires

0
votes

Eh bien, c'est simple pour chaque emploi2utilisateur ure obtenir tout lieu2utilisateur c'est pourquoi c'est multiple. U devrait compter dans la sous-requête puis utiliser la jointure gauche.


0 commentaires