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 :

Requête DELETE avec sous requête


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 15
    Points
    15
    Par défaut Requête DELETE avec sous requête
    Bonjour à tous,

    P'tit nouveau sur le forum mais avec une peu de pratique en MySQL je sollicite votre aide pour une requête qui m'en fait voir de toutes les couleurs

    Je dispose de 3 tables que voici :

    task (qui contient) :

    - id_task int(10)
    - name_task varchar(40)
    - color_task varchar(10)
    - date_task varchar(10)
    - state_task int(1)

    list_task (qui contient) :

    - id_list int(10)
    - id_task int(10)
    - position_task int(10)

    list (qui contient) :

    - id_list int(10)
    - name_list varchar(40)

    Pour faire une brève explication, je travaille sur un gestionnaire de tâches, donc le principe est de créer des listes, des tâches, et de pouvoir les supprimer.

    Mon problème est que lorsque je supprime une liste, les tâches qui se trouvent à l'intérieur ne sont pas supprimées dans ma BDD.

    Voici ma requête :

    DELETE FROM task WHERE id_task =(SELECT t.id_task FROM task AS t INNER JOIN list_task AS lt ON t.id_task = lt.id_task WHERE lt.id_list=1);

    Je travaille sous phpMyAdmin, le SELECT fontionne à merveille mais le DELETE me pose un problème. Voici l'erreur qui s'affiche lorsque j'exécute ma requête :



    J'aimerais beaucoup caler tout ça en une seule requête mais je suis quand même ouvert à toutes propositions

    Merci d'avance, à très bientôt !

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Un truc bizarre : dans la requête que tu écris, la parenthèse est bien fermée mais dans le rapport de phpMyAdmin elle ne l'est pas !
    L'erreur se trouve peut-être de ce côté là ?

    Sinon une remarque conceptuelle :
    Si tu supprimes les taches quand tu supprimes la liste, cela veut dire qu'une tâche ne peut être associée qu'à une liste ?
    Si oui, alors supprime ta table associative et met l'id_list directement dans la table task ainsi que le position_task.

    Si ce n'est pas le cas, ce ne sont pas les tâches qu'il faut supprimer mais les 'list_task'.
    Dans les deux cas la requête est plus simple.
    Cas oui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM task
    WHERE id_list = LeNumeroDeLaListeSupprimee
    Cas non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM list_task
    WHERE id_list = LeNumeroDeLaListeSupprimee
    Dans les deux cas, avec des tables de type InnoDb, tu accèdes aux clés étrangères et aux contraintes d'intégrité qui vont avec. Du coup quand tu supprimes une liste, tu supprimes automatiquement en cascade les enregistrements qui sont liés à la liste.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Exact, petite erreur de ma part quand je ferme la parenthèse voici l'erreur :



    En ce qui concerne votre petite feinte avec les tables innoDb j'y ai pensé cependant j'ai un suiveur pour mon projet ( je suis en école d'ingénieur en informatique ) et il nous interdit d'utiliser cela sous prétexte qu'un jour ou l'autre on pourrait avoir des problèmes avec cette méthode.

    En ce qui concerne votre question :

    Citation Envoyé par CinePhil Voir le message
    Sinon une remarque conceptuelle :
    Si tu supprimes les taches quand tu supprimes la liste, cela veut dire qu'une tâche ne peut être associée qu'à une liste ?
    C'est tout à fait ça, une tâche ne peut être associer qu'à une unique liste, je vais donc essayer votre méthode de suppression de la table intermédiaire et je post dans la soirée pour vous tenir au courant

    Merci bien.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Tout à fait géniale ! C'est parfait tout marche à merveille

    Je me suis donc contenté de 2 tables :

    task (qui contient) :

    - id_list int(10)
    - id_task int(10)
    - name_task varchar(40)
    - color_task varchar(10)
    - date_task varchar(10)
    - state_task int(1)
    - position_task int(10)

    list (qui contient) :


    - id_list int(10)
    - name_list varchar(40)

    Les requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM task WHERE id_list = LeNumeroDeLaListeSupprimee
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM list WHERE id_list = LeNumeroDeLaListeSupprimee
    Et voilà le tour est joué, lorsque je supprime la liste, les tâches qui sont contenues dedans sont supprimées avec

    Encore merci !

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par El-Toro Voir le message
    En ce qui concerne votre petite feinte avec les tables innoDb j'y ai pensé cependant j'ai un suiveur pour mon projet ( je suis en école d'ingénieur en informatique ) et il nous interdit d'utiliser cela sous prétexte qu'un jour ou l'autre on pourrait avoir des problèmes avec cette méthode.
    Je sens que ça va faire bondir les spécialistes de SGBDR ça ! Si M; Brouard voit ça je crois qu'il va réagir !

    C'est tout à fait ça, une tâche ne peut être associer qu'à une unique liste, je vais donc essayer votre méthode de suppression de la table intermédiaire
    En fait dans ce cas là il n'y a plus besoin de table intermédiaire !
    Le schéma est :
    list -1,n----Affecter----1,1- task

    Ce qui donne :
    list(id_list, ...)
    task(id_task, FK_id_list, ....)

    Et donc la première requête que j'ai donnée dans l'autre message.

    On a répondu en même temps !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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. Delete avec sous-requête synchronisée
    Par blekc dans le forum Langage SQL
    Réponses: 9
    Dernier message: 19/05/2009, 16h12
  2. Requète UPDATE avec sous-requète dans la même table.
    Par Selenite dans le forum Langage SQL
    Réponses: 6
    Dernier message: 16/03/2009, 15h04
  3. Requête Update avec Sous-requête
    Par Yohann_x dans le forum Requêtes
    Réponses: 8
    Dernier message: 16/02/2008, 13h19
  4. Erreur syntaxe SQL DELETE avec sous requête
    Par jeanbenoit1987 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 07/12/2007, 12h14
  5. DELETE avec sous-requête
    Par say dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/04/2005, 08h20

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