Requête SQL

Fermé
Numbyscuit Messages postés 18 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 23 janvier 2013 - 25 juin 2012 à 13:22
Numbyscuit Messages postés 18 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 23 janvier 2013 - 26 juin 2012 à 09:58
Bonjour,
J'aurai un petite question concernant les requêtes SQL.
Tout d'abord, la requête suivante :
SELECT *
FROM adresses
LEFT OUTER JOIN avoir ON avoir.ID_Adresse = adresses.ID_Adresse
WHERE avoir.ID_Client IS NULL
OR avoir.ID_Adresse IS NULL


M'affiche ce tableau :
http://sd-2.archive-host.com/membres/up/162483317445951997/tableau.jpg

J'aimerai maintenant supprimer tous les champs adresses n'étant pas liés à la table clients via la table avoir.

Ainsi, j'utilise une requête DELETE :
DELETE FROM adresses
WHERE ID_Adresse IN(
SELECT * FROM adresses
LEFT OUTER JOIN avoir
ON avoir.ID_Adresse = adresses.ID_Adresse
WHERE avoir.ID_Client IS NULL OR avoir.ID_Adresse IS NULL)


Cependant, PhpMyAdmin me renvoie le message d'erreur suivant :
#1241 - Operand should contain 1 column(s)

Et je ne comprend pas pourquoi ni ce qui peut clocher dans ma requête.
Je vous remercie d'avance pour vos éclaircissements.

5 réponses

maka54 Messages postés 698 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 4 décembre 2016 80
25 juin 2012 à 14:11
DELETE FROM adresses
WHERE ID_Adresse IN(
SELECT ID_Adresse FROM adresses
LEFT OUTER JOIN avoir
ON avoir.ID_Adresse = adresses.ID_Adresse
WHERE avoir.ID_Client IS NULL OR avoir.ID_Adresse IS NULL)
1
DELETE adresses.*
FROM adresses
LEFT JOIN avoir ON avoir.ID_Adresse = adresses.ID_Adresse
WHERE avoir.ID_Adresse IS NULL


Ce SQL supprime toute ligne de la table "adresses" dont la valeur de "ID_Adresse" n'est pas présente dans avoir.ID_Adresse, autrement dit toute adresse non-utilisée par la table "avoir", qu'importe que le client existe ou non.

Est-ce vraiment ce qui est souhaité ?
1
Numbyscuit Messages postés 18 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 23 janvier 2013
25 juin 2012 à 14:28
PhpMyAdmin m'a renvoyé le message d'erreur suivant :
#1052 - Column 'ID_Adresse' in field list is ambiguous

J'ai donc adapté la requête SQL :
DELETE FROM adresses
WHERE adresses.ID_Adresse IN(
SELECT adresses.ID_Adresse FROM adresses
LEFT OUTER JOIN avoir
ON avoir.ID_Adresse = adresses.ID_Adresse
WHERE avoir.ID_Client IS NULL OR avoir.ID_Adresse IS NULL)


Et j'ai eu l'erreur suivante :
#1093 - You can't specify target table 'adresses' for update in FROM clause
0
Numbyscuit Messages postés 18 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 23 janvier 2013
25 juin 2012 à 18:28
Super ! Ça marche, merci !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Numbyscuit Messages postés 18 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 23 janvier 2013
Modifié par Numbyscuit le 26/06/2012 à 10:00
Bonjour,
J'aurai une autre question.
J'aimerai que le client puisse mettre à jour son nom et prénom (jusqu'ici, aucun problème), mais que ça renvoie un message d'erreur si un client partageant la même adresse que lui a déjà le même nom et prénom.

Voici tout d'abord le formulaire qui renvoie les informations :
  
<form method="post" action="ciblezone.php">  
        <br />  
        <h5>- Les champs marqués d'un <span class=\"ast\">*</span> sont obligatoires.<br />  
          - L'identifiant doit être compris entre 3 et 20 caractères. <br/> - Le mot de passe entre 5 et 20 caractères. <br/>  
          - Le nom et le prénom doivent être compris entre 2 et 20 caractères.<br/>  
          - Si vous remplissez un des champs de l'adresse postale, il vous sera demandé de remplir les autres.<br />  
          </h5>  
        <fieldset class="inscr">  
        <legend>Informations sur le site</legend>  
          <span class="ast">*</span><label for="pseudo">Identifiant : </label>  
          <input type="text" name="pseudo" id="pseudo" class="champ" value="<?php echo htmlspecialchars($_SESSION['pseudo']) ?>" required /> <br /><br />  
            
          <span class="ast">*</span><label for="psw">Mot de passe : </label>  
          <input type="password" name="psw" id="psw" class="champ" required value ="<?php echo htmlspecialchars($_SESSION['psw']) ?>" /> <br /><br />  
              
          <span class="ast">*</span><label for="repsw">Confirmez votre mot de passe : </label>  
          <input type="password" name="repsw" id="repsw" class="champ" value="<?php echo htmlspecialchars($_SESSION['repsw']) ?>" required /> <br /> <br />  
            
          <span class="ast">*</span><label for="mail">Email : </label>  
          <input type="email" name="mail" id="mail" class="champ" required value="<?php echo htmlspecialchars($_SESSION['mail']) ?>" /> <br />  
        </fieldset>   
        <br />  
          
        <fieldset class="inscr">  
        <legend>Informations personnelles de l'utilisateur</legend>  
          <span class="ast">*</span><label for="nom">Nom : </label>  
          <input type="text" name="nom" id="nom" class="champ" value="<?php echo htmlspecialchars($_SESSION['nom']) ?>" required /> <br /><br />  
            
          <span class="ast">*</span><label for="prenom">Prénom : </label>  
          <input type="text" name="prenom" id="prenom" class="champ" value="<?php echo htmlspecialchars($_SESSION['prenom']) ?>" required  /> <br /><br />  
            
          <label for="tel">Numéro de téléphone : </label>  
          <input type="text" name="tel" id="tel" class="champ" value="<?php echo htmlspecialchars($_SESSION['tel']) ?>"  /> <br />  
        </fieldset>  
        <br />  
          
          
        <br />  
          
        <div class="inscr">  
          <input type="submit" value="Mettre à jour" />   
          <input type="reset" value="Réinitialiser" />   
        </div>  

       </form> 


Voilà maintenant la connexion à la BDD et la définition des variables de post, de session, et de la fonction "anti-doublon".

  

         
       <?php   

       /*Connexion à BDD */  
        try  
       {  
        // On se connecte à MySQL  
        $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;   
        $bdd = new PDO('mysql:host=localhost;dbname=bdd_exiastore', 'root', '', $pdo_options);  
        $bdd->exec('SET NAMES utf8');  
          
       }  
       catch(Exception $e)  
       {  
        // En cas d'erreur, on affiche un message et on arrête tout  
         die('Erreur : '.$e->getMessage());  
       }  

        // Paramètres pour un pseudo unique  
       $log = $_POST['pseudo'];  
       $currentLog = $_SESSION['pseudo']; // Définition du pseudo courant, pour ne pas que ça affiche d'erreur si le login reste inchangé  
       $sql = "SELECT * FROM clients WHERE clients.PseudoClient ='".$log."' AND clients.PseudoClient <> '".$currentLog."' ";     
       $req = $bdd->query($sql);     
       $req->setFetchMode(PDO::FETCH_OBJ);   
         
        // Paramètres pour un mail unique  
       $courriel = $_POST['mail'];    
       $currentMail = $_SESSION['mail']; // Définition du mail courant, pour ne pas que ça affiche d'erreur si le mail reste inchangé  
       $sqlDeux = "SELECT * FROM clients WHERE clients.EmailClient ='".$courriel."' AND clients.EmailClient <> '".$currentMail."' ";   
       $reqDeux = $bdd->query($sqlDeux);     
       $reqDeux->setFetchMode(PDO::FETCH_OBJ);  
         
        // Nom  
       $name = $_POST['nom'];    
       $currentName = $_SESSION['nom'];       
         
         
        // Prénom  
       $prename = $_POST['prenom'];    
       $currentPrename = $_SESSION['prenom'];   
         
       // Vérification  
         
       $checkAdd = $bdd->query("SELECT adresses.RueAdresse, adresses.CPAdresse, adresses.VilleAdresse, adresses.PaysAdresse, clients.NomClient, clients.PrenomClient   
       FROM(  
       (adresses INNER JOIN avoir  
       ON avoir.ID_Adresse = adresses.ID_Adresse)  
       INNER JOIN clients  
       ON clients.ID_Client = avoir.ID_Client )  
       WHERE clients.NomClient ='".$name."' AND clients.NomClient <> '".$currentName."' AND  clients.NomClient ='".$prename."' AND clients.NomClient <> '".$currentPrename."'   
       ");  
          

       $checkAdd->setFetchMode(PDO::FETCH_OBJ);  


Le tout sera vérifié par cette condition :
  
else if($ligneAdd = $checkAdd->fetch() )  
       {  
       echo "Un autre compte possède déjà les mêmes nom, prénom, et adresse. " ;   
       header("Refresh: 3; URL= zone.php" ) ;  
       }  


Or, le code semble totalement ignorer ces conditions. Sauriez-vous où est le problème, s'il vous plait ?
0