probleme de SELECT pour recherche dans deux tables...

Mammouth du PHP | 843 Messages

07 mai 2007, 10:53

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.
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

ViPHP
ViPHP | 5924 Messages

07 mai 2007, 11:32

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).

Mammouth du PHP | 843 Messages

07 mai 2007, 11:50

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 ;)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

ViPHP
ViPHP | 5924 Messages

07 mai 2007, 12:26

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.

Mammouth du PHP | 843 Messages

07 mai 2007, 13:30

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 ;)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

07 mai 2007, 13:49

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). "' ";
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 843 Messages

07 mai 2007, 14:14

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 ;)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

07 mai 2007, 14:37

(...) 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 ...

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

07 mai 2007, 14:37

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.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 843 Messages

07 mai 2007, 14:54

comment puis je faire alors pour verifier l'existance d'un pseudo dans l'une ou l'autre des tables?
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 843 Messages

07 mai 2007, 14:56

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 ;)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 843 Messages

07 mai 2007, 15:01

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?
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

07 mai 2007, 15:03

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

07 mai 2007, 21:56

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 ?

ViPHP
ViPHP | 5924 Messages

07 mai 2007, 22:27

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...