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: p>
5 Réponses :
Vous devez utiliser compter (distinct ...) code> 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. P>
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`;
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`
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
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. P>