Page 1 sur 2

probleme de SELECT pour recherche dans deux tables...

Posté : 07 mai 2007, 10:53
par BeRoots
salut à tous ;)

je cherche à verifier l'existance d'un pseudo dans deux tables distinct contenant toutes les deux un champ pseudo :-k

ma requete est la suivante:

Code : Tout sélectionner

SELECT COUNT( * ) AS pomme FROM `table_1`,`table_2` WHERE `pseudo` = '$pseudo'
l'erreur sql est la suivante:
Champ: 'pseudo' dans where clause est ambigu
si quelqu'un a une idée sur la question ;)

merci d'avance.

Posté : 07 mai 2007, 11:32
par Sékiltoyai
Pour différencier les champs dans les tables, utilises table.champ pour indiquer au serveur quelle table il doit considérer.
Si tu cherches à récupérer le nombre de couples d'enregistrements ayant le même pseudo dans 2 tables, je te conseille d'utiliser une jointure plutôt qu'un produit cartésien.
Enfin, avec les COUNT, il faut utiliser des clauses GROUP BY le plus souvent (réfère toi à la doc MySQL pour en savoir plus).

Posté : 07 mai 2007, 11:50
par BeRoots
jai bien essayer cette requete qui fonctionne mais le soucis est que mon champ 'pomme' retourne 0 alors qu'il devrait retourner 1 :-k

Code : Tout sélectionner

SELECT COUNT( * ) AS pomme FROM `table_membre` , `table_config` WHERE table_membre.pseudo = 'pseudo_existant' AND table_config.pseudo = 'pseudo_existant'
si quelqu'un voit quelque chose ;)

Posté : 07 mai 2007, 12:26
par Sékiltoyai
En fait, si tu n'as que cette donnée là à récupérer, tu peux faire ceci :
SELECT 1
FROM `table_membre` JOIN `table_config` ON table_membre.pseudo=table_config.pseudo
WHERE table_membre.pseudo='pseudo';

Et ensuite vérifier le nombre de résultats avec mysql_num_rows()
C'est une facon de faire beaucoup plus économique.

Posté : 07 mai 2007, 13:30
par BeRoots
j'ai essayé et la requete passe sans erreur mais rien n'est retourné. :(

afin de faire encore mieux je fait ainsi:

Code : Tout sélectionner

SELECT COUNT( * ) FROM `table_membre` JOIN `table_config` ON table_membre.pseudo = table_config.pseudo WHERE table_membre.pseudo = 'pseudo_existant'
Mais toujour pareille, rien n'est retourner que mon pseudo existe dans l'une ou l'autre des tables :?

en faite pour m'expliquer un peu mieux, j'ai deux table. l'une contient plein d'enregistrement dont un champ pseudo. l'autre contient 2 enregistrement avec des pseudo specifique. Mon objectif est de verifier l'existence d'un pseudo dans les deux table afin d'eviter la creation de pseudo identique à ceux des deux table dans la première table. :-k

il faut donc que je verifie l'existance d'un dit pseudo dans les deux table.

le probleme des deux precedente requete est que en entrant un même pseudo d'une des deux tables, aucun enregisterement dont le pseudo est le meme n'est retourner (alors que bien present soit dans l'une soit dans l'autre)

si quelqu'un a une idée ;)

Posté : 07 mai 2007, 13:49
par sadeq
Peut être en évitant les espaces non significatifs éventuellement contenus dans la table ou dans le champ entré. pour celà on utilise généralement la fonction trim() dans la recherche de chaînes.

En PHP, celà devrait s'écrire:
$sql = "SELECT COUNT(*) as compte
FROM `table_membre` 
JOIN `table_config` ON table_membre.pseudo = table_config.pseudo 
WHERE TRIM(table_membre.pseudo) = '" . trim($pseudo). "' ";

Posté : 07 mai 2007, 14:14
par BeRoots
etrange mais non, rien de mieux car rien de retourner pourtant aucun espace car je trim toujour et on ne tient pas compte de la casse :?

Code : Tout sélectionner

SELECT COUNT( * ) AS pomme FROM `table_membre` JOIN `table_config` ON table_membre.pseudo = table_config.pseudo WHERE table_membre.pseudo = 'beroots'
c'est quand même bizard que rien ne soit retourner dans pomme lorsque je propose un pseudo existant d'une des deux tables :-k

si quelqu'un a une idée ;)

Posté : 07 mai 2007, 14:37
par Truc
(...) existant d'une des deux tables
Il faut que le pseudo existe dans les deux pour que "pomme" retourne un résultat, cf :

Code : Tout sélectionner

... table_membre.pseudo = table_config.pseudo ...

Posté : 07 mai 2007, 14:37
par zeus
non, ce n'est pas étrange ... ;)

Ta jointure portant sur le champ "pseudo", SQL va retourner toutes les lignes pour lesquels les champs "pseudo" de la table 1 correspond à une des valeurs du champ "pseudo" de la table 2.

Quand un pseudo existe dans la table 1 mais pas dans la table 2, SQL n'associe pas les lignes et ne retourne pas ce pseudo.

Donc, quand tu fait une restriction sur un pseudo qui n'existe que dans l'une des 2 tables, il est normal que tu n'obtiennes aucune réponse.

Posté : 07 mai 2007, 14:54
par BeRoots
comment puis je faire alors pour verifier l'existance d'un pseudo dans l'une ou l'autre des tables?

Posté : 07 mai 2007, 14:56
par BeRoots
j'ai trouver (ou presque) sur un coup de bol :)

Code : Tout sélectionner

SELECT COUNT( * ) AS pomme FROM `table_membre` JOIN `table_config` ON table_membre.pseudo != table_config.pseudo WHERE table_membre.pseudo = 'pseudo'
par contre rien est retourner lorsque j'essaye avec un pseudo existant de table_config :?

quelqu'un a une idée ;)

Posté : 07 mai 2007, 15:01
par BeRoots
ok j'ai fait ainsi et tout semble marcher :-k

Code : Tout sélectionner

SELECT COUNT( * ) AS pomme FROM `table_membre` JOIN `table_config` ON table_membre.pseudo != table_config.pseudo WHERE table_membre.pseudo = 'roots' OR table_config.pseudo = 'roots'
qu'en penser vous?

Posté : 07 mai 2007, 15:03
par zeus
Dans ton cas précis, ça me semble être bon.

Quand tu spécifies le problème, c'est "Je veux toutes les lignes de la 1ere table dont le pseudo n'est pas présent dans la 2nd table". C'est ce que représente ta jointure.

Par contre, en faisant comme ça, tu ne sélectionnes pas les lignes de ta 1ere table qui ne sont pas dans la seconde ...
Si tu cherches à éviter les doublons, te ne verras plus les pseudos qui sont déjà dans la 1ere table

Posté : 07 mai 2007, 21:56
par Hubert Roksor
Je peux me tromper en lisant, mais apparemment cette requête ne retournera jamais que 0 puisqu'on lui demande une condition de jointure qui interfère avec la clause WHERE.

@BeRoots : le mieux que tu aies à faire c'est d'expliquer ce que tu veux faire en oubliant comment tu veux le faire. À force d'essayer des combinaisons un petit peu au hasard tu risques de tomber sur quelque chose qui donne l'impression de marcher par coincidence. Donc, qu'est-ce que tu veux faire exactement ?

Posté : 07 mai 2007, 22:27
par Sékiltoyai
Pour sélectionner un pseudo qui est dans l'une ou l'autre des tables, je pense que le plus économique est alors :

Code : Tout sélectionner

SELECT 1 FROM `table1` WHERE `pseudo`="pseudo" UNION SELECT 1 FROM `table2` WHERE `pseudo`="pseudo"
Et tu vérifies ensuite qu'il y a un résultat...
Je peux me tromper en lisant, mais apparemment cette requête ne retournera jamais que 0 puisqu'on lui demande une condition de jointure qui interfère avec la clause WHERE.
C'est moi qui lui ait conseillé la jointure, mais à vrai dire, je ne savais pas trop ce qu'il voulait faire...