sélection de doublons

Le
unbewusst.sein
sans doute une question basique ;-)

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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jogo
Le #21901671
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 --
unbewusst.sein
Le #21901661
Jogo

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
Le #21901651
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...



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
Le #21901641
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.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
unbewusst.sein
Le #21901631
Mickaël Wolff

Tu ne peux pas donner un alias à une table dans une requête delete,
sous MySQL.



Ah ok, merci beaucoup, je comprends le pourquoi du comment.

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...
--
Une Bévue
Jogo
Le #21901621
Sur fr.comp.applications.sgbd, Une Bévue disait :

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
Le #21901601
Jogo

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
Publicité
Poster une réponse
Anonyme