probleme de SELECT pour recherche dans deux tables...

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

07 mai 2007, 22:38

Nan, en fait ta requête plus haut est très bien et probablement la plus économique si ça correspond à ce que BeRoots souhaite obtenir. L'embêtant c'est qu'apparemment ce n'est pas le cas et que la raison n'est pas claire. C'est pour ça que je recommande de reprendre tout à zéro et s'assurer de ses intentions plutôt que d'essayer des trucs au hasard.

Mammouth du PHP | 843 Messages

24 mai 2007, 23:05

ok je reprend ce post car je pense qu'hubert a raison et que je ne veut laisser aucun doute à ce sujet.

de plus le problème c'est qu'en fait je dois verifié l'existance du couple pseudo/pass dans l'une ou l'autre des tables

j'ai fait ainsi mais rien n'est retourné:

Code : Tout sélectionner

SELECT * FROM `table1` JOIN `table2` ON table1.pseudo != table2.pseudo AND table1.mpass != table2.mpass WHERE table1.pseudo = 'BeRoots1' AND table1.mpass = 'motdepass' OR table2.pseudo = 'BeRoots1' AND table2.mpass = 'motdepass'
quelqu'un aurrai t'il une idée à soumettre? ;)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

ViPHP
ViPHP | 5924 Messages

24 mai 2007, 23:25

C'est une usine à gaz cette requète, c'est quasiment aussi peu performant qu'un produit cartésien. C'est vraiment utile de récupérer tous les couples d'enregistrement qui n'ont pas de pseudo commun ? Parce que la requète que tu nous montre diffère énormément de la question de départ.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

25 mai 2007, 00:12

quelqu'un aurrai t'il une idée à soumettre? ;)
Ben euh, la même qu'au départ : explique ce que tu veux faire plutôt que d'expliquer comment tu veux le faire.

Mammouth du PHP | 843 Messages

25 mai 2007, 09:33

ce que je veut faire: je dois verifié l'existance du couple pseudo/pass dans l'une ou l'autre des tables 1 & 2.

si quelqu'un voit quelque chose car j'ai du mal à poser ma requete pour quel scan les deux tables d'un coup... :?
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

25 mai 2007, 09:36

arrgh :(

À part ça, pourrais-tu s'il te plait décrire plus précisément ce que tu entends par "verifié l'existance du couple pseudo/pass dans l'une ou l'autre des tables" ? En particulier ce qui est autorisé, ce qui ne l'est pas, ainsi que les données que tu veux récupérer.

Mammouth du PHP | 843 Messages

25 mai 2007, 09:49

en gros on recupere la ligne correspondante à un pseudo dans les 2 tables sachant qu'il est impossible qu'il y ai des doublon pour ce pseudo car un pseudo est unique et ne peut etre dans les deux tables en meme temps (soit l'une soit l'autre).

ensuite je travaillerai sur ce que retourne la ligne car la table 1 tient copte d'un champs d'activation du compte alors que la table 2 n'en tient pas compte... mais ça je pense y arriver ;)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 843 Messages

25 mai 2007, 10:44

j'ai bien essayer de me passer de la jointure et faire ainsi mais vue que mes deux table ne sont pas identique, mysql me repond qu'il y a difference de colonne ...

Code : Tout sélectionner

requête SQL: SELECT pseudo, mpass, activ FROM `table1` WHERE pseudo = 'pseudo' UNION SELECT pseudo, mpass FROM `table2` WHERE pseudo = 'pseudo' MySQL a répondu:Documentation #1222 - The used SELECT statements have a different number of columns
j'aimerai pourtant faire une seul requete simple qui releverai la ligne complete coresspondante au pseudo dans l'une ou l'autre des tables.

si quelqu'un peut m'aider ;)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

25 mai 2007, 11:37

en gros
...on avait dit en détail ?
on recupere la ligne correspondante à un pseudo dans les 2 tables
Si tu dis "je récupère la ligne d'un pseudo dans 2 tables" ça veut dire que le pseudo existe dans les deux tables et qu'une jointure est faite entre les deux, mais ça semble être contredit par le reste de ton message. Ce que tu veux ce sont les infos d'un pseudo dans chacune des tables ? (donc pas en même temps, sans jointure)
il est impossible qu'il y ai des doublon pour ce pseudo car un pseudo est unique et ne peut etre dans les deux tables en meme temps
Quand tu dis qu'il ne peut pas, tu veux dire qu'il ne doit pas ? À cet instant est-ce qu'il y a des pseudos qui ne respectent pas cette règle et c'est ce que tu veux éliminer ? Désolé mais je ne comprends rien à tes messages :-k
la table 1 tient copte d'un champs d'activation du compte alors que la table 2 n'en tient pas compte...
Ce serait dommage de perdre du temps sur une requête qui ne convient même pas à ce que tu veux faire. La logique de ce "champs d'activation" peut totalement changer la requête, ce serait mieux de décrire vraiment ce que tu veux faire et pourquoi tu veux le faire, sinon on va passer encore trois mois à discuter de toutes les requêtes que tu auras essayé au hasard pour s'apercevoir que la solution était cent fois plus simple. :?

Mammouth du PHP | 843 Messages

25 mai 2007, 13:22

voici ce que j'ai fait pour faire plus simple (mais plus lourd en code):
      $connexion = mysql_connect($hostdb, $userdb, $passdb) or die('Erreur SQL !<br />'.$connexion.'<br />'.mysql_error());

      //sélection de la BDD
      $db = mysql_select_db($usedb,$connexion) or die('Erreur SQL !<br />'.$db.'<br />'.mysql_error());

      // selection de la ligne avec le couple pseudo/pass pour la table membre
      $sql = "SELECT `pseudo`,`activ` FROM `$table1` WHERE (`pseudo` = '$pseudo' and `mpass` = '$crypt')";
      $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
      
      // si la recherche dans la table 1 renvoi qqchose
      if($result != '')
      {
         // on defini les deux variable retourner par SQL
         while ($tabl_sql = mysql_fetch_assoc($result))
         {
            $pseudo_db  = $tabl_sql['pseudo'];
            $activation = $tabl_sql['activ'];
         }
      }
      // sinon on recherche dans la table 2
      else
      {
         // selection de la ligne avec le couple pseudo/pass pour la table 2
         $sql = "SELECT `pseudo` FROM `$table2` WHERE (`pseudo` = '$pseudo' and `mpass` = '$crypt')";
         $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
         // on defini la variable retourner par SQL et on definit l'autre à true
         while ($tabl_sql = mysql_fetch_assoc($result))
         {
            $pseudo_db  = $tabl_sql['pseudo'];
            $activation = true;
         }
      }
      // déconnection avec MySQL
      mysql_close();
en gros je scan ma table1 et si on trouve rien, on cherche dans table2...
le seul default qui me chagrine est le if($result != '') afin de verifie que ma requete 1 n'a rien retourner

1) y a t'il un autre moyen simple de voir si ma requete 1 retourne qqchose?
2) si quelqu'un voit une methode plus simple via une seul requete SQL ;)

@hubert:
- il est imposible d'y avoir des boublons avec un même pseudo car je m'assure que chaque nouveau pseudo n'existe pas dans table1 & table2
- il n'y a aucune jointure entre mes deux tables. elles sont independante et different l'une de l'autre.
- ce que je cherche à faire c'est en une seul requete, recuperer la possible ligne correspondant à un couple pseudo/pass definit, en scannant les deux tables :?
pour table1 on recupererai les champs pseudo et activ et pour table2 seulement pseudo car activ n'existe pas :?

merci d'avance
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 843 Messages

25 mai 2007, 17:01

ok j'ai fini par faire en deux requete comme suit:
      $connexion = mysql_connect($hostdb, $userdb, $passdb) or die('Erreur SQL !<br />'.$connexion.'<br />'.mysql_error());

      //sélection de la BDD
      $db = mysql_select_db($usedb,$connexion) or die('Erreur SQL !<br />'.$db.'<br />'.mysql_error());

      // selection de la ligne avec le couple pseudo/pass pour la table1
      $sql = "SELECT `pseudo`,`activ` FROM `table1` WHERE (`pseudo` = '$pseudo' and `mpass` = '$crypt')";
      $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
      $tabl_sql = mysql_fetch_assoc($result);

      // si la recherche dans la table1 membre renvoi qqchose
      if($tabl_sql != '')
      {
         // on defini les deux variable retourner par SQL
         $pseudo_db  = $tabl_sql['pseudo'];
         $activation = $tabl_sql['activ'];
      }
      // sinon on recherche dans la table2
      else
      {
         // selection de la ligne avec le couple pseudo/pass pour la table2
         $sql = "SELECT `pseudo` FROM `table2` WHERE (`pseudo` = '$pseudo' and `mpass` = '$crypt')";
         $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
         $tabl_sql = mysql_fetch_assoc($result);
         // on defini la variable retourner par SQL et on definit l'autre à true
         $pseudo_db  = $tabl_sql['pseudo'];
         $activation = true;
      }
      // déconnection avec MySQL
      mysql_close();
si quelqu'un voit plus simple, merci du conseil ;)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non: