IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

effacer des enregistrements en comparant avecune autre table


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 26
    Par défaut effacer des enregistrements en comparant avecune autre table
    Bonjour,

    je suis débutant et je voudrai effacer des lignes d'une table 1 en utilisant un critères de comparaison avec une autre table. Je fais cette requête à partir de
    la console phpmyadmin qui utilise mysql 4.1.23

    Voici en concret ce que je veux faire.
    J'ai 2 tables

    T1 (nuke_users)

    tid username ref ...
    1 nom1
    2 nom2
    3 nom3
    4 nom4


    T2 (nuke_comments)

    tid name commentaire ...
    1 nomA
    2 nom1
    3 nom4
    4 nomB
    5 nomB
    6 nom3

    Je supprime régulièrement à la main dans la table T1 les utilisateurs indésirables (dans l'exemple ci-dessus nomA et nomB).

    Je veux avec une requête, supprimer les lignes dans la table T2 dont le nom n'existe pas dans la table T1 (dans l'exemple ci-dessus suprimer la ligne 1,4 et 5 dont les valeurs 'name' de T2 n'ont pas de correspondance avec les valeurs 'username' de T1).

    le résultat de cette requête sera alors

    T2 (nuke_comments)

    tid name commentaire ...
    2 nom1
    3 nom4
    6 nom3

    seulement les lignes 1,4 et 5 seront effacées.

    En lisant différent poste et manuel SQL, j'ai réalisé cette requête mais le résultat est que toute les lignes sont effacées à chaque fois dans la table T2 alors que je veux conserver les lignes 2,3 et 6.

    DELETE `T2` FROM `T2`,`T1` WHERE `T2`.`NAME` <> `T1`.`USERNAME`

    D'avance, merci pour votre aide.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DELETE  FROM T2
    WHERE T2.NAME not in (Select T1.USERNAME
                                       From T1)

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    A noter que la structure de la BDD n'est pas ainsi optimale.
    La table t2 devrait accueillir le 'tid' de la table t1 à la place du nom.
    Et avec l'utilisation du moteur InnoDB, il serait déclaré une clé étrangère qui empêcherait l'inseertion dans t2 d'un utilisateur n'existant pas dans t1. de plus, l'utilisation de la clause ON DELETE CASCADE supprimerait automatiquement les commentaires des utilisateurs supprimés dans t1.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 26
    Par défaut
    Bonjour teach,

    ma première requête était identique à la tienne et ne fonctionnait pas. J'ai fini par trouver. Ta requête fonctionne, mais dans la console phpmyadmin il faut mettre des guillemets comme ceci pour que cela fonctionne : ` et ne pas utiliser le modèle du clavier de la touche 4 qui est : '

    Donc la requête doit être écrite comme cela pour que la console de phpmyadmin puisse la lire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DELETE FROM `nuke_comments` 
    WHERE `nuke_comments`.`NAME` NOT IN (
      select `nuke_users`.`USERNAME` 
      from `nuke_users`)
    et surtout pas l'écrire comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DELETE FROM 'nuke_comments' 
    WHERE 'nuke_comments'.'NAME' NOT IN (
      select 'nuke_users'.'USERNAME' 
      from 'nuke_users')
    sinon cela crée cette erreur bidon : #1064 - You have an error in your SQL syntax. Ce n'est pas une erreur de programme mais juste une erreur de forme de guillemet.

    Merci pour ton aide, cela m'a permis de comprendre mon erreur.

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Tu peux aussi écrire ta requête sans aucun signe autour des noms de table et de colonne si ceux-ci :
    - ne comportent pas d'espace ;
    - ne sont pas des mots du langage SQL.

    Les deux principes ci-dessus relevant des bonnes pratiques à adopter au plus vite, je déteste cette sale manie qu'a phpMyAdmin d'ajouter les ` autour des noms dans les requêtes. Ça crée des confusions, la preuve !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 29/01/2010, 20h25
  2. Comment récupérer des données, les comparer à une autre table.
    Par soria_t dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 06/08/2008, 17h58
  3. Réponses: 2
    Dernier message: 27/07/2006, 07h46
  4. [Debutant] Appel d'enregistrement issu d'une autre table
    Par grasduslip dans le forum Access
    Réponses: 15
    Dernier message: 21/07/2006, 16h34
  5. Réponses: 2
    Dernier message: 23/06/2006, 14h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo