Requête SQL

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