dans une base, j'ai deux tables : folders et bookmarks.
dans la table folders je veux supprimer un à un les dossiers qui ont
même nom et même parent
les colonnes de folders : id, parent_id, level, name ;
ensuite après avoir supprimé un dossier, je dois noter l'id du dossier
restant (au même niveau hiérarchique càd ayant le même parent_id) ainsi
que du supprimé
et attribuer l'id du dossier restant au bookmarks qui étaient dans le
dossier supprimé càd ayant un folder_id = à l'id du dossier supprimé.
les colonnes de bookmarks : id, folder_id, name, url ;
j'utilise MySql
bien sûr, j'ai essayé, avec un LEFT JOIN mais, ça me retourne tous les
folders et même les dupliqués sont dupliqués )))
--
Une Bévue
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Jogo
Salut,
sans doute une question basique ;-)
Ben les doublons ça peut être coton parfois.
dans la table folders je veux supprimer un à un les dossiers qui ont même nom et même parent
ensuite après avoir supprimé un dossier, je dois noter l'id du dossier restant (au même niveau hiérarchique càd ayant le même parent_id) ainsi que du supprimé et attribuer l'id du dossier restant au bookmarks qui étaient dans le dossier supprimé càd ayant un folder_id = à l'id du dossier supprimé.
Bon voilà les pistes sur lesquelles je partirais à ta place. Note bien que je suis loin d'être un spécialiste.
Je pense qu'il faut commencer par la mise à jour de bookmarks :
UPDATE bookmarks SET folder_id = ( SELECT min(b.id) FROM folders a JOIN folders b ON a.parent_id = b.parent_id AND a.name = b.name WHERE a.id = bookmarks.folder_id )
Ensuite on efface les doublons dans folders :
DELETE FROM folders a WHERE id != ( SELECT min(id) FROM folders b WHERE a.parent_id = b.parent_id AND a.name = b.name )
Bien sûr rien de tout cela n'a été testé.
j'utilise MySql
Pas moi, il est donc possible que ce que je viens de te donner ne marche pas, même si j'ai essayé d'écrire du SQL standart.
-- Et étant donné que ceux qui sont fondamentalement "contre" la proposition ne présentent aucun argument sur le fond, et se foutent visiblement de ce qu'il pourrait advenir aux forums listés, l'utilité de la proposition est clairement démontré. -- Catherine Simon sur fufe --
Salut,
sans doute une question basique ;-)
Ben les doublons ça peut être coton parfois.
dans la table folders je veux supprimer un à un les dossiers qui ont
même nom et même parent
ensuite après avoir supprimé un dossier, je dois noter l'id du dossier
restant (au même niveau hiérarchique càd ayant le même parent_id) ainsi
que du supprimé
et attribuer l'id du dossier restant au bookmarks qui étaient dans le
dossier supprimé càd ayant un folder_id = à l'id du dossier supprimé.
Bon voilà les pistes sur lesquelles je partirais à ta place. Note
bien que je suis loin d'être un spécialiste.
Je pense qu'il faut commencer par la mise à jour de bookmarks :
UPDATE bookmarks
SET folder_id = (
SELECT min(b.id)
FROM folders a
JOIN folders b
ON a.parent_id = b.parent_id
AND a.name = b.name
WHERE a.id = bookmarks.folder_id )
Ensuite on efface les doublons dans folders :
DELETE FROM folders a
WHERE id != (
SELECT min(id)
FROM folders b
WHERE a.parent_id = b.parent_id
AND a.name = b.name )
Bien sûr rien de tout cela n'a été testé.
j'utilise MySql
Pas moi, il est donc possible que ce que je viens de te donner ne
marche pas, même si j'ai essayé d'écrire du SQL standart.
--
Et étant donné que ceux qui sont fondamentalement "contre" la
proposition ne présentent aucun argument sur le fond, et se foutent
visiblement de ce qu'il pourrait advenir aux forums listés, l'utilité
de la proposition est clairement démontré.
-- Catherine Simon sur fufe --
dans la table folders je veux supprimer un à un les dossiers qui ont même nom et même parent
ensuite après avoir supprimé un dossier, je dois noter l'id du dossier restant (au même niveau hiérarchique càd ayant le même parent_id) ainsi que du supprimé et attribuer l'id du dossier restant au bookmarks qui étaient dans le dossier supprimé càd ayant un folder_id = à l'id du dossier supprimé.
Bon voilà les pistes sur lesquelles je partirais à ta place. Note bien que je suis loin d'être un spécialiste.
Je pense qu'il faut commencer par la mise à jour de bookmarks :
UPDATE bookmarks SET folder_id = ( SELECT min(b.id) FROM folders a JOIN folders b ON a.parent_id = b.parent_id AND a.name = b.name WHERE a.id = bookmarks.folder_id )
Ensuite on efface les doublons dans folders :
DELETE FROM folders a WHERE id != ( SELECT min(id) FROM folders b WHERE a.parent_id = b.parent_id AND a.name = b.name )
Bien sûr rien de tout cela n'a été testé.
j'utilise MySql
Pas moi, il est donc possible que ce que je viens de te donner ne marche pas, même si j'ai essayé d'écrire du SQL standart.
-- Et étant donné que ceux qui sont fondamentalement "contre" la proposition ne présentent aucun argument sur le fond, et se foutent visiblement de ce qu'il pourrait advenir aux forums listés, l'utilité de la proposition est clairement démontré. -- Catherine Simon sur fufe --
unbewusst.sein
Jogo wrote:
Je pense qu'il faut commencer par la mise à jour de bookmarks :
oui, d'accord, le truc est de prendre le min(id) pigé, merci beaucoup, je saurais adapter à mysql... -- Une Bévue
Jogo <jogo@matabio.net> wrote:
Je pense qu'il faut commencer par la mise à jour de bookmarks :
oui, d'accord, le truc est de prendre le min(id) pigé, merci beaucoup,
je saurais adapter à mysql...
--
Une Bévue
Je pense qu'il faut commencer par la mise à jour de bookmarks :
oui, d'accord, le truc est de prendre le min(id) pigé, merci beaucoup, je saurais adapter à mysql... -- Une Bévue
unbewusst.sein
Une Bévue wrote:
> Je pense qu'il faut commencer par la mise à jour de bookmarks :
oui, d'accord, le truc est de prendre le min(id) pigé, merci beaucoup, je saurais adapter à mysql...
bon, j'ai commencé par vérifier que : SELECT * FROM folders a WHERE id != ( SELECT min(id) FROM folders b WHERE a.parent_id = b.parent_id AND a.name = b.name )
me retournait les "bons" folders.
c'est OK
puis je suis passé "à la vraie vie" avec ce que tu m'as donné.
pas de problème pour déplacer les bookmarks (je n'avais pas testé la commande).
par contre, en remplaçant SELECT * FROM par DELETE FROM, j'ai un message d'erreur de syntaxe :
Code d'erreur : 1064 Message d'erreur : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a WHERE id != ( SELECT min(id) FROM folders b WHERE a.parent_id = b.parent_id AN' at line 1 SQLSTATE d'erreur : 42000
je suppose qu'en général le message d'erreur commence là où le parser a trouvé une erreur.
je vérifie donc cette syntaxe, bizarre que la syntaxe ne permette pas de remplacer select * par delete...
-- Une Bévue
Une Bévue <unbewusst.sein@weltanschauung.com.invalid> wrote:
> Je pense qu'il faut commencer par la mise à jour de bookmarks :
oui, d'accord, le truc est de prendre le min(id) pigé, merci beaucoup,
je saurais adapter à mysql...
bon, j'ai commencé par vérifier que :
SELECT * FROM folders a WHERE id != ( SELECT min(id)
FROM folders b WHERE a.parent_id = b.parent_id AND a.name = b.name )
me retournait les "bons" folders.
c'est OK
puis je suis passé "à la vraie vie" avec ce que tu m'as donné.
pas de problème pour déplacer les bookmarks (je n'avais pas testé la
commande).
par contre, en remplaçant SELECT * FROM par DELETE FROM, j'ai un message
d'erreur de syntaxe :
Code d'erreur : 1064
Message d'erreur : You have an error in your SQL syntax; check the
manual that corresponds to your MySQL server version for the right
syntax to use near 'a WHERE id != ( SELECT min(id) FROM folders b WHERE
a.parent_id = b.parent_id AN' at line 1
SQLSTATE d'erreur : 42000
je suppose qu'en général le message d'erreur commence là où le parser a
trouvé une erreur.
je vérifie donc cette syntaxe, bizarre que la syntaxe ne permette pas de
remplacer select * par delete...
> Je pense qu'il faut commencer par la mise à jour de bookmarks :
oui, d'accord, le truc est de prendre le min(id) pigé, merci beaucoup, je saurais adapter à mysql...
bon, j'ai commencé par vérifier que : SELECT * FROM folders a WHERE id != ( SELECT min(id) FROM folders b WHERE a.parent_id = b.parent_id AND a.name = b.name )
me retournait les "bons" folders.
c'est OK
puis je suis passé "à la vraie vie" avec ce que tu m'as donné.
pas de problème pour déplacer les bookmarks (je n'avais pas testé la commande).
par contre, en remplaçant SELECT * FROM par DELETE FROM, j'ai un message d'erreur de syntaxe :
Code d'erreur : 1064 Message d'erreur : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a WHERE id != ( SELECT min(id) FROM folders b WHERE a.parent_id = b.parent_id AN' at line 1 SQLSTATE d'erreur : 42000
je suppose qu'en général le message d'erreur commence là où le parser a trouvé une erreur.
je vérifie donc cette syntaxe, bizarre que la syntaxe ne permette pas de remplacer select * par delete...
-- Une Bévue
Mickaël Wolff
Une Bévue a écrit :
je suppose qu'en général le message d'erreur commence là où le parser a trouvé une erreur.
En général, oui.
je vérifie donc cette syntaxe, bizarre que la syntaxe ne permette pas de remplacer select * par delete...
Tu ne peux pas donner un alias à une table dans une requête delete, sous MySQL.
Donc, si j'ai bien pigé avec SELECT je récupère les IDs que je dois supprimer et ensuite, plus besoin de jointure, je fais un delete bêbête...
fastidieux...
Tu peux peut-être utiliser une table temporaire si MySQL supporte ça.
-- http://ardus.matabio.net/realisations/
unbewusst.sein
Jogo wrote:
Tu peux peut-être utiliser une table temporaire si MySQL supporte ça.
comme ce n'est pas une tâche très récurrente, je l'ai réalisée en deux étapes comme expliqué plus haut. la mémorisation entre les deux étapes étant donnée par le script (ruby).
-- Une Bévue
Jogo <jogo@matabio.net> wrote:
Tu peux peut-être utiliser une table temporaire si MySQL supporte ça.
comme ce n'est pas une tâche très récurrente, je l'ai réalisée en deux
étapes comme expliqué plus haut.
la mémorisation entre les deux étapes étant donnée par le script (ruby).
Tu peux peut-être utiliser une table temporaire si MySQL supporte ça.
comme ce n'est pas une tâche très récurrente, je l'ai réalisée en deux étapes comme expliqué plus haut. la mémorisation entre les deux étapes étant donnée par le script (ruby).