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 :

Récupérer les Ids d'une table pour les supprimer d'une autre table


Sujet :

Requêtes MySQL

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 551
    Points : 264
    Points
    264
    Par défaut Récupérer les Ids d'une table pour les supprimer d'une autre table
    Bonjour,
    J'ai deux tables

    ticket:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    +--------------------+-----------------+------+-----+---------+----------------+
    | Field              | Type            | Null | Key | Default | Extra          |
    +--------------------+-----------------+------+-----+---------+----------------+
    | ticket_id          | int(8) unsigned | NO   | PRI | NULL    | auto_increment |
    | ticket_user_id     | int(8) unsigned | NO   | MUL | NULL    |                |
    | ticket_status      | varchar(6)      | NO   |     | opened  |                |
    | ticket_subject     | varchar(100)    | NO   | MUL | NULL    |                |
    | ticket_message     | text            | NO   |     | NULL    |                |
    +--------------------+-----------------+------+-----+---------+----------------+
    ticket_reply:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    +------------------------+-----------------+------+-----+---------+----------------+
    | Field                  | Type            | Null | Key | Default | Extra          |
    +------------------------+-----------------+------+-----+---------+----------------+
    | ticket_reply_id        | int(8) unsigned | NO   | PRI | NULL    | auto_increment |
    | ticket_reply_ticket_id | int(8) unsigned | NO   | MUL | NULL    |                |
    | ticket_reply_showname  | varchar(40)     | YES  |     | NULL    |                |
    | ticket_reply_message   | text            | NO   |     | NULL    |                |
    +------------------------+-----------------+------+-----+---------+----------------+
    ticket_reply_ticket_id correspond à ticket_id pour lier ces deux tables.

    En PHP j'ai un $userId et j'ai besoin de pouvoir supprimer tous les tickets mais aussi toutes les réponses à ces tickets de cet $userId.

    Est-il possible de le faire en une ou deux requêtes SQL ou est-ce que je dois faire un delete dans ticket_reply pour chaque ticket récupéré appartement à $userId?

    Merci.

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Dans ton cas, je pense que tu n'as que deux requêtes SQL à faire.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    -- On supprime toutes les réponses des tickets concernées.
    delete from ticket_reply where ticket_reply_ticket_id in ( select ticket_id from ticket where  ticket_user_id  = :UserId);
    -- On supprime tous les tickets concernées.
    delete from ticket where  ticket_user_id  = :UserId;
    La version pour vérifier qu'on a bien la bonne requête de sélection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    -- On supprime toutes les réponses des tickets concernées.
    select * from ticket_reply where ticket_reply_ticket_id in ( select ticket_id from ticket where  ticket_user_id  = :UserId);
    -- On supprime tous les tickets concernées.
    select * from ticket where  ticket_user_id  = :UserId;
    Note : la requête sur la table ticket_reply n'est pas nécessaire si la déclaration de relation avec la table ticket a été réalisé correctement avec une clé étrangère et une suppression en cascade.
    (13.1.17.5 Using FOREIGN KEY Constraints)

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 551
    Points : 264
    Points
    264
    Par défaut
    Bonsoir,

    Merci pour ton aide. Dans un premier temps, on m'a dit que les tables étaient mal nommées et qu'il fallait éviter d'utiliser le nom de la table dans les colonnes, sauf pour les clefs étrangères.

    Donc j'ai renommé mes toutes mes tables (10 en tout). Par exemple, pour ticket et ticket_reply.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mysql> describe ticket;
    +-------------+-----------------+------+-----+---------+----------------+
    | Field       | Type            | Null | Key | Default | Extra          |
    +-------------+-----------------+------+-----+---------+----------------+
    | id          | int(8) unsigned | NO   | PRI | NULL    | auto_increment |
    | status      | varchar(6)      | NO   |     | opened  |                |
    | subject     | varchar(100)    | NO   | MUL | NULL    |                |
    | message     | text            | NO   |     | NULL    |                |
    +-------------+-----------------+------+-----+---------+----------------+
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    mysql> describe ticket_reply;
    +-----------+-----------------+------+-----+---------+----------------+
    | Field     | Type            | Null | Key | Default | Extra          |
    +-----------+-----------------+------+-----+---------+----------------+
    | id        | int(8) unsigned | NO   | PRI | NULL    | auto_increment |
    | ticket_id | int(8) unsigned | NO   | MUL | NULL    |                |
    | showname  | varchar(40)     | YES  |     | NULL    |                |
    | message   | text            | NO   |     | NULL    |                |
    +-----------+-----------------+------+-----+---------+----------------+
    8 rows in set (0.01 sec)
    Ça a impacté 48 fichiers PHP que j'ai du modifier à la main ! J'étais content ! D'autant plus que comme on se retrouve avec des tables ayant la même colonne "id" et j'ai du utiliser des alias.

    Pour les clefs étrangères dans ticket_reply, en effet, ticket_id est une clef de la table ticket, un simple INT(11) en fait. Je ne pourrais pas mettre toutes les tables ayant des clefs étrangères en InnoDB à cause de FULLTEXT indexes non supporté par le moteur de stockage InnoDB mais uniquement par le moteur MyISAM qui lui ne supporte pas les clefs étrangères.

    La priorité est au FULLTEXT indexes, pas aux clefs étrangères.

    Pour les triggers ou déclencheurs, j'en ai encore jamais fait. Il faudrait que je me penche dessus.

    En tout cas, merci pour ton aide,
    Vincent.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 551
    Points : 264
    Points
    264
    Par défaut
    Pour le Déclencheur, j'y suis arrivé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DELIMITER $$
    CREATE TRIGGER `ticket_delete` BEFORE DELETE ON `ticket` FOR EACH ROW BEGIN
    DELETE FROM ticket_reply
        WHERE ticket_reply.ticket_id = OLD.id;
    END
    $$
    DELIMITER ;
    Je ne connaissais pas les TRIGGERS, ça marche bien est c'est bien pratique je trouve

  5. #5
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Normalement, il est possible de généré ce trigger via la déclaration de la clé étrangère avez une simple indication.
    Mais le résultat sera le même.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par kolodz Voir le message
    Note : la requête sur la table ticket_reply n'est pas nécessaire si la déclaration de relation avec la table ticket a été réalisé correctement avec une clé étrangère et une suppression en cascade.
    (13.1.17.5 Using FOREIGN KEY Constraints)
    Cordialement,
    Patrick Kolodziejczyk.
    Oui, quoique si la table concernée par la contrainte contient des volumes importants ou si elle est elle même parente d'autres tables ayant elles mêmes des contraintes FK, il est préférable de poser une contrainte "ON DELETE SET NULL" et de supprimer les lignes mises à nul dans un deuxième temps, via un batch dédié. Ceci pour éviter les delete en masse en heure pleine (les déplacements de pages de données et la journalisation ont un cout significatif)

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 17/03/2015, 22h42
  2. Récupérer des noms de fichier dans une table pour les placer en masque du tfilelist
    Par charliplanete dans le forum Développement de jobs
    Réponses: 11
    Dernier message: 24/08/2011, 17h16
  3. Réponses: 62
    Dernier message: 16/04/2009, 10h09
  4. Réponses: 1
    Dernier message: 08/02/2009, 15h43
  5. Réponses: 2
    Dernier message: 05/11/2008, 10h36

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