probleme de SELECT pour recherche dans deux tables...

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : probleme de SELECT pour recherche dans deux tables...

par BeRoots » 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 ;)

par BeRoots » 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

par Hubert Roksor » 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. :?

par BeRoots » 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 ;)

par BeRoots » 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 ;)

par Hubert Roksor » 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.

par BeRoots » 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... :?

par Hubert Roksor » 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.

par Sékiltoyai » 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.

par BeRoots » 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? ;)

par Hubert Roksor » 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.

par Sékiltoyai » 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...

par Hubert Roksor » 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 ?

par zeus » 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

par BeRoots » 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?