Page 1 sur 1

Besoin d'une requête pour comparer 2 tables

Posté : 02 sept. 2006, 00:25
par Devether
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.

Posté : 02 sept. 2006, 00:47
par Truc
Salut,
Tu peux commencer par regarder ce post (dans la FAQ) sur les jointures. :)

Posté : 04 sept. 2006, 01:20
par Devether
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 ?

Posté : 04 sept. 2006, 11:47
par Truc
(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

Posté : 04 sept. 2006, 14:21
par Devether
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