MYSQL Update via SELECT

Tags:: mysql

Ce coup-ci j'ai cherché longtemps... et j'ai trouvé! Le problème était de corriger une table mal foutue: il fallait que j'update une table en assignant des valeur dans un champs provenant d'un select sur la même table. Attendez, je vais vous montrer le problème.

Imaginons une table de ce genre "BandeDessinée":

  • id (int auto_increment)
  • titre (varchar 255)
  • type (varchar 255)

Or voilà, "type" est un varchar (255) qui contient un type de bande dessinée. On décide de faire une table qui contient les types (bdtypes):

  • id (int auto_increment)
  • type (varchar 255)

Maintenant, le but c'est de faire la jointure entre les deux tables. On va ajouter un champs dan la table des bande dessinées:

  • id (int auto_increment)
  • titre (varchar 255)
  • type (varchar 255)
  • type_id (int)

Comme ça, quand ce sera rempli, je pourrais supprimer le champs "type" qui ne me servira à rien.

Dans la table de types, j'ai des valeurs: commics, épique, histoire, action, romance...

Et dans le champs de type de la table de bande dessinée... j'ai un peu n'importe quoi... mais en gros j'ai presque les même noms (à quelques majuscules près).

Je me dis alors: "go, un vieux update avec un select et ça va passer tout seul". **Et bien on !* Voilà sur quoi j'étais parti:


UPDATE INTO bande_dessinee bd SET bd.type_id = (
   SELECT DISTINCT ty.id FROM bdtypes ty
   INNER JOIN bande_dessinee bd1
   ON ty.type LIKE concat("%",bd1.type,"%")
   WHERE bd1.id = bd.id
);
 

Tu parles... pourtant la requête de select est bonne (cherchez pas, même si j'ai foiré mon code dans le billet, ce qui est fort possible parce que je ne bosse pas sur une table si simple de bande dessinées, mais sur une table un peu plus violente... je vous assure, et je vous jure que mon select passait parfaitement tant qu'il n'était pas dans le update set)

En gros, le select imbriqué refuse de voir l'alias "bd". ET j'aurais beau sortir le WHERE l'erreur reste la même...

Bon, je vais pas tortiller pendant 3 ans, je vous donne la solution.


UPDATE bande_dessinee bd
   JOIN bdtypes ty ON
   bd.type LIKE concat ('%',ty.type,'%')
SET bd.type_id = ty.id
 

Grosso modo, on fait une jointure entre "bande_dessinee" et "bdtypes" pour récupérer la valeur qui colle les deux tables. Cette valeur étant "bdtypes.type vers bande_dessinee.type". La jointure permet d'une part de récupérer la ligne à modifier mais aussi les valeurs à récupérer dans la table jointe. C'est en fait un peu plus puissant qu'un select imbriqué :)

On récupère alors bdtype.id (alias ty.id) que l'on insert dans bande_dessinee.

Je peux vous assurer que quand ça a marché, j'ai fait un beau sourir à mon écran de PC !

Utilisez le code barre pour ouvrir le ticket dans votre mobile:
This ticket on you mobile

Pas de commentaire pour le moment

Ajouter un commentaire
Veuillez répondre à la question suivante : Tapez en minuscule le nom de l'animal qui fait miaou

Trackbacks

Pour ajouter un trackback (retrolien) sur ce ticket, utilisez cette adresse: http://www.metal3d.org/index.php/trackback/default/tb?id=blog%2F242

Tags

Blog Copix Communication PC Config Fedora Vidéo Humour Autre Web Materiel Informatique PHP Développement Mootools HTML Linux WEB IE CSS Vista Microsoft Sympa XHTML Quizz Widget Klik CWE Voeux Bonne année Musique CCRMA Son Audio MAO Reconnaissance vocale Windows Mac Compiz MacOS Mysql Sun Base de données BD Screenlets Screenlet RPM compiz Ubuntu Live FireFox Derambarsh Facebook media informations Sécurité javascript SSH Commande Marketing concours ipod wii QT Trooltech Nokia Libre Logiciels GPL Attali Gnome Dock Compiler Bench undelete reiserfs recovery recover Thread Serveur Optimisation Server Apache Album RSS Flash Air XML Firefox Blender Opensource Orange Internet LiveBox Animaux Droits Logiciels Libres Google Loi RBS netcat Bash Téléphone Spam 3D NIDIA Standards Widgets Merise UML Streaming Developpement Perl MySQL Firewall Parfeu Bayes Novell Réseau Python LVS Salon FTP Dedibox Chrome Administration IRC Gentoo troll video Nouveauté Finance Etudiant spéctacle OpenOffice Javascript Java Info Eclpise ATI design mootools KDE Bureau Design GNU C Pages Jaunes Fun Bijoux Art mail Admin vmware fedora linux VirtualBox VMWare Qemu KVM vim Grep Fglrx Webkit GTK google web JQuery Coup de gueule coup de gueule Lois SVG Raycaster Canvas Hadopi Desktop Jeux Les Sims développement astuces Screen firefox Mobile Safaru Wine bash commande astuce Wave ooc C++ C# Netbook Hercules Bureautique Twitter Safari W3C chrome kazehakaze midori navigateur gecko webkit Links Liens Pyhon Nouvelles Metal Perso Conférence JDLL PCC Roadsend OOC News Acteur Cinéma Chanteur Seven windows orthographe pcc php jdll Slide Application mysql Html twitter python screen curses SVN Android Gphone iPhone OpenGL MindMap Projet Javascrtip Ajax Guitare Tab Tablature JSON firebug Chromium Iphone Titanium music sound android ogg ogv streaming

  • twitter entries...
follow me on Twitter

Valid XHTML 1.0 Strict