Besoin d'une requête pour comparer 2 tables

Eléphant du PHP | 134 Messages

02 sept. 2006, 00:25

Bonjour,

J'attaque directement!

J'ai 2 tables :

Code : Tout sélectionner

=> table "user" +---------+-----------+-------------+ | user_id | user_name | user_passwd | +---------+-----------+-------------+ | 1 | USER_1 | a | | 2 | USER_2 | a | | 3 | USER_3 | a | | 4 | USER_4 | a | | 5 | USER_5 | a | +---------+-----------+-------------+

Code : Tout sélectionner

=> table "stats" +----------+-----------+-------------+ | stats_id | user_name | ... | +----------+-----------+-------------+ | 1 | USER_1 | ... | | 2 | USER_2 | ... | | 3 | USER_3 | ... | | 4 | USER_9 | ... | | 5 | USER_7 | ... | +----------+-----------+-------------+
Dans la première table, ce sont les utilisateurs autorisés à se connecter.
Dans la seconde, ce sont les statistiques de plusieurs personnes comprenant les utilisateurs de la première table ainsi que d'autres personnes dont les statistiques sont sans intérêt.

Je voudrais créer une requête permettant de lister tous les 'stats.user_name' qui ne sont pas présent dans 'user.user_name'.

J'ai testé avec cette requête :

Code : Tout sélectionner

SELECT stats.user_name FROM `stats` , `user` WHERE stats.user_name != user.user_name
Mais celle-ci m'affiche tous les 'stats.user_name' sans exception.

Est ce que j'ai quelque chose à modifier dans ma requête ou bien dois-je procéder de manière totalement différente?

Merci d'avance.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

02 sept. 2006, 00:47

Salut,
Tu peux commencer par regarder ce post (dans la FAQ) sur les jointures. :)

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 134 Messages

04 sept. 2006, 01:20

j'ai testé ceci :

Code : Tout sélectionner

SELECT stats.Agent, user.user_name FROM stats LEFT JOIN user ON stats.Agent = user.user_name GROUP BY stats.Agent, user.user_name
(j'ai été obligé de renommer 'stats.user_name' en 'stats.Agent' sinon je ne pouvais pas comparer)

Ca me donne la liste des 'stats.Agent' en entier à coté de la liste des 'user.user_name' dans laquelle pour chaque nom de 'stats.Agent' qui n'a pas de correspondance on obtient 'NULL'

je suis donc obligé ensuite de faire ça :
<?php
while ($data=mysql_fetch_array($result)){ 

	extract($data);
	if ($Agent!=$user_name){
		echo $Agent."<br />";
	} 
}
?>
ça marche mais est ce qu'il ne serait pas possible de tout faire directement dans la requête ?

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

04 sept. 2006, 11:47

(j'ai été obligé de renommer 'stats.user_name' en 'stats.Agent' sinon je ne pouvais pas comparer)
tu peux utiliser des alias,avec AS pour "renommer" le temps de la requête le champ :

Code : Tout sélectionner

SELECT stats.user_name AS name1, user.user_name AS name2 FROM ...
tu fera appel à name1 et name2 par la suite.

Pour la requête ajoute une clause WHERE :

Code : Tout sélectionner

stats LEFT JOIN user ON stats.user_name= user.user_name WHERE user.user_name IS NULL

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 134 Messages

04 sept. 2006, 14:21

Merci beaucoup!! Avec cette requête ça marche beaucoup mieux :

Code : Tout sélectionner

SELECT tlt_stats.Agent FROM tlt_stats LEFT JOIN tlt_user ON tlt_stats.Agent = tlt_user.user_name WHERE tlt_user.user_name IS NULL GROUP BY tlt_stats.Agent