Requête SQL

Numbyscuit Messages postés 18 Statut Membre -  
Numbyscuit Messages postés 18 Statut Membre -
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

  1. maka54 Messages postés 721 Statut Membre 80
     
    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
  2. A.Nonymous
     
    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
  3. Numbyscuit Messages postés 18 Statut Membre
     
    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
  4. Numbyscuit Messages postés 18 Statut Membre
     
    Super ! Ça marche, merci !
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Numbyscuit Messages postés 18 Statut Membre
     
    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