Page 1 sur 1

Problème de JOIN

Posté : 22 janv. 2008, 18:58
par VaN
Bonjour,

J'ai une table USERS, dans laquelle je stocke les utilisateurs enregistrés sur le site. Dans cette table, j'ai un champ user_parrain_id, qui est soit égal à 0 si l'utilisateur s'est inscrit sans l'aide d'un parrain, soit égal au user_id de son parrain.

Sur une page, j'aimerai afficher la liste des utilisateurs, ainsi que leur nombre de filleuls.

Voici ma requête :
"SELECT user_id, user_login, user_level, user_mail, COUNT(user_id) as Filleuls
		FROM ".$prefixe."users
		INNER JOIN ".$prefixe."users ON user_id = user_parrain_id
		GROUP BY user_id";
Je reçois l'erreur suivante :
Erreur : Table/alias: 'users' non unique
J'imagine que j'utilise mal le INNER JOIN. Quelqu'un pourrait-il me dire où est l'erreur ?
--
-- Structure de la table `users`
--

CREATE TABLE `users` (
`user_id` int(11) NOT NULL auto_increment,
`user_login` text character set latin1 collate latin1_general_cs NOT NULL,
`user_pass` text character set latin1 collate latin1_general_cs NOT NULL,
`user_mail` text NOT NULL,
`user_level` tinyint(4) NOT NULL,
`user_activated` tinyint(4) NOT NULL,
`user_activation_key` text character set latin1 collate latin1_general_cs NOT NULL,
`user_logged` tinyint(4) NOT NULL,
`user_points` int(11) NOT NULL,
`user_parrain_id` int(11) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=21 ;

Posté : 22 janv. 2008, 19:51
par mojorisin
Salut,
en fait tu joins une table sur elle même le problème viens simplement de là.
Il te faut alors utiliser un alias pour que le serveur puisse faire la différence entre les champs que tu souhaite, de jointure etc..

De plus il te faut utiliser une jointure externe pour rapatrier également les utilisateurs n'ayant pas de filleul.

Exemple :

Code : Tout sélectionner

SELECT u2.user_id, u2.user_login, u2.user_level, u2.user_mail, COUNT( u1.user_id ) AS Filleuls FROM users AS u1 RIGHT JOIN users AS u2 ON u1.user_parrain_id = u2.user_id GROUP BY user_id