Partage
  • Partager sur Facebook
  • Partager sur Twitter

Arive pas à faire une requête -> Problèmes innoDB

    1 décembre 2010 à 9:27:20

    Bonjour à tous,
    je fait en ce moment une sorte d'interface administrateur destinée à supprimer certain "test". Je vous explique le fonctionnement: J'ai une base tests_proprietes qui contient L'ID du test, le nom des test, leur auteur et d'autres attribut. Il faut savoir que les tests contienne des 'trous', en html des <input />. Et chacun de ces trous à un nom unique (par exemple '45965328' ).
    Donc j'ai une table 'trous' qui contient un champ 'ID_element' = le nom du trou, et le champs ID_test_parent = l'ID du test.
    Et en plus, j'ai une table 'stats'. En fait, chaque trous à ses statistiques pour chaque utilisateurs ... Donc j'ai le champ 'ID_util', puis le 'ID_trou' = le nom du trou correspondant ...
    Pour en revenir à mon interface, je rentre l'ID du test (ex: 456). Donc mon code peut déjà supprimé les bonnes entrées dans les tables 'test_proprietes' et 'trous'. Mais je ne vois pas comment faire pour les statistiques ... n'ayant pas le nom du test_parent ...
    J'ai pensé à récupérer dans trous tous les références de trous, de les mettre dans un array, puis avec un foreach les enlevées de 'stats' ... Mais c'est lourd et je n'ai pas réussi ...
    Merci beaucoup.
    • Partager sur Facebook
    • Partager sur Twitter
      1 décembre 2010 à 9:43:42

      DELETE FROM stats 
      WHERE stats.ID_trou IN (
          SELECT s.ID_trou FROM stats s
          INNER JOIN trous t ON s.ID_trou = t.ID_element
          INNER JOIN test_proprietes p ON t.ID_test_parent = p.ID_test
          WHERE p.ID_test = 456
      )
      


      Essaie ça (vérifie d'abord que la sous-requête donne les bon trous mais normalement c'est bon).
      • Partager sur Facebook
      • Partager sur Twitter
        1 décembre 2010 à 9:59:53

        table tests_proprietes (ID du test, le nom des test, leur auteur et d'autres attribut)
        table trous (ID_element = le nom du trou, ID_test_parent = l'ID du test )
        table stats (ID_util, ID_trou = le nom du trou correspondant ...)

        Tu devrais avoir créé des relations (FOREIGN KEY) entre ces tables, en spécifiant l'attribut ON DELETE CASCADE. Ensuite si tu DELETE dans la table trous, les lignes correspondantes dans les autres tables seront automatiquement supprimées. Voir le tuto sur les relations.
        • Partager sur Facebook
        • Partager sur Twitter
          1 décembre 2010 à 10:22:43

          Pour le casque noir, ton truc, c'est des tables innoBDD ? Moi j'ai pas encore ça ...
          Sinon, j'essaye la requête de Taguan, et je me renseigne sur le fonctionnement de IN ... (je connais pas encore.).
          • Partager sur Facebook
          • Partager sur Twitter
            1 décembre 2010 à 10:24:35

            Ma solution devrait fonctionner, mais ça vaut franchement la peine de se pencher sur les FOREIGN KEY pour ce genre de choses. Ca te simplifiera la vie pour pas mal de choses et ça peut t'éviter pas mal d'erreur et/ou incohérence dans ta DB.
            • Partager sur Facebook
            • Partager sur Twitter
              1 décembre 2010 à 10:37:44

              Citation : Dominique0796

              Pour le casque noir, ton truc, c'est des tables innoDB ?



              Tu peux changer le type de tes tables dans phpmyadmin.
              • Partager sur Facebook
              • Partager sur Twitter
                1 décembre 2010 à 10:38:38

                D'accord, mais c'est quoi ces FOREIGN KEY ? En attendant, ton code bugg ... voilà le message:
                Warning: PDO::query() [pdo.query]: SQLSTATE[HY000]: General error: 1093 You can't specify target table 'stats' for update in FROM clause in C:\wamp\www\scola02\texte_a_trous\udpate.php on line 44
                Les entrées correspondante au test 512 ont été supprimées.

                bon, je redonne la requête, parce que les noms que j'avais donnés était à moitié érronés: voilà:
                DELETE FROM stats WHERE stats.ID_element IN ( SELECT stats.ID_element FROM stats s INNER JOIN trous t ON s.ID_element = t.ID_trou INNER JOIN test_proprietes p ON t.ID_test_parent = p.ID_test WHERE p.ID_test = '.$_POST['test_p'].' )'
                j'ai pas compris ce que voulais dire le message ...
                Pour les innoBD, ça change en rien pour le reste ?
                • Partager sur Facebook
                • Partager sur Twitter
                  1 décembre 2010 à 10:44:06

                  DELETE FROM stats
                  WHERE stats.ID_element IN (
                  SELECT t.ID_trou FROM trous t INNER JOIN test_proprietes p ON t.ID_test_parent = p.ID_test WHERE p.ID_test = '.$_POST['test_p'].' )'

                  En fait on peut pas modifier une table qu'on est en train de lire. J'ai donc retiré stats de la sous-requete.

                  Et non, InnoDB change rien, si ce n'est que tu peux utiliser des trucs sympa comme les FOREIGN KEY (sur lesquelles tu trouveras plein d'infos partout en cherchant un peu).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    1 décembre 2010 à 10:57:26

                    Ca fait pas de buggg .mais ça marche pas ... Bon, c'est pas grave, je me renseigne sur les innobd ...
                    he, je n'arrive pas à changer le moteur, c'est où ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      1 décembre 2010 à 22:24:35

                      ALTER TABLE machin ENGINE=InnoDB
                      • Partager sur Facebook
                      • Partager sur Twitter
                        2 décembre 2010 à 9:29:15

                        D'accord, je suis entrain d'étudier le tuto de mikael, et je bloque : au moment de cliquer sur 'gestion des relations', voilà ce que ça m'affiche ... je te passe une capture:
                        Gestion des relation de la table enfant après avoir cocher le champ matricule_me
                        Bon ... Je mofifie ça comment ? En cochant ou non le champ 'matricule_me', c'est pareil ...
                        Merci bien.
                        Sinon, je vois qu'on pourrais le faire avec ceci:
                        ALTER TABLE `enfant` ADD CONSTRAINT `enfant_ibfk_1` FOREIGN KEY (`matricule_me`) REFERENCES `mere` (`matricule_me`) ON DELETE CASCADE ON UPDATE CASCADE;
                        MAis à quoi sert le ADD CONSTRAINT ? Que vient faire ce 'enfant_ibfk_1' ?
                        Merci bien.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Arive pas à faire une requête -> Problèmes innoDB

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown