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.
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).
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.
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.).
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.
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à: DELETEFROMstatsWHEREstats.ID_elementIN(SELECTstats.ID_elementFROMstatssINNERJOINtroustONs.ID_element=t.ID_trouINNERJOINtest_proprietespONt.ID_test_parent=p.ID_testWHEREp.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 ?
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).
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ù ?
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:
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: ALTERTABLE`enfant`ADDCONSTRAINT`enfant_ibfk_1`FOREIGNKEY(`matricule_me`)REFERENCES`mere`(`matricule_me`)ONDELETECASCADEONUPDATECASCADE;
MAis à quoi sert le ADD CONSTRAINT ? Que vient faire ce 'enfant_ibfk_1' ?
Merci bien.
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.
Tutoriel complet MySQL !
Tutoriel complet MySQL !
Tutoriel complet MySQL !