Faire un INSERT dans un select

Fermé
orion999 Messages postés 23 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 5 janvier 2010 - 28 nov. 2009 à 18:09
toma_f_1 Messages postés 89 Date d'inscription dimanche 29 novembre 2009 Statut Membre Dernière intervention 16 décembre 2009 - 29 nov. 2009 à 16:21
Bonjour,

Je suis actuellement en train de développer un système de maitre/esclave en php, le maitre gère la base de données dans la quel on fait des recherches et les esclaves explorent le web afin de trouver de nouvelles informations.

La communication ce fait sous forme de requête HTTP, l'esclave demande des liens à analyser, le maitre lui répond, une fois analyser l'esclave renvoie au maitre les résultat de ses analyses.

Les réponses sont en fait l'affichage direct des requêtes (le demandeur n'a plus qu'as directement les exécuter pour mettre à jour sa base de données).

Je stocke des mots clé dans une table sous cette forme:

CREATE TABLE IF NOT EXISTS `keywords` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `keyword` varchar(128) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


Ensuite je fait une relation avec les urls analysée dans une autre table, de cette façon j'évite les redondances d'informations.

Le problème est que l'esclave ne sais pas si il est tomber sur un nouveau mot clé... je me suis donc dis faisons une petite condition... si le mot clé y est on chope son id... sinon on l'insère.

Cependant comme je l'ai dis, les requêtes sont générée chez l'esclave et le maitre les exécute bêtement... donc la condition dois pouvoir être mise directement dans la requête SQL.

Voila ce que j'ai pour le moment:

INSERT INTO `url_keywords` ( `id_url`, `id_keyword` ) VALUES ( 68, ( SELECT CASE WHEN ( SELECT `id` FROM `keywords` WHERE `keyword` = "mot clé" ) <> "" THEN SELECT `id` FROM `keywords` WHERE `keyword` = "mot clé" ELSE INSERT INTO `keywords` ( `keyword` ) VALUES ( "mot clé" ) END ) );


Sauf que comme vous vous en doutez certainement... j'ai droit à une jolie erreur de syntaxe

Comment faire pour arriver au résultat que je souhaite ?

Notons qu'il est possible de faire plusieurs requêtes (variables utilisateurs ?) cependant j'utilise mysql_query... (je ne sais pas si sa bride en quelques chose...

Merci d'avance pour votre aide, indication, ...
Cordialement, La source.

2 réponses

Giorgiolino Messages postés 253 Date d'inscription vendredi 15 mai 2009 Statut Contributeur Dernière intervention 2 mars 2015 52
29 nov. 2009 à 14:29
Bonjour,

une manière élégante (et efficace) de résoudre ton problème est de faire appel aux procédures stockées. Cela te permet d'insérer des structures conditionnelles dans des requêtes sql.

Plus d'infos ici --> http://dev.mysql.com/doc/refman/5.0/fr/stored-procedure-syntax.html


Bon courage.
0
toma_f_1 Messages postés 89 Date d'inscription dimanche 29 novembre 2009 Statut Membre Dernière intervention 16 décembre 2009 7
29 nov. 2009 à 16:21
la référence pour moi en ce qui concerne la syntaxe SQL : http://sql.1keydata.com/fr/sql-insert-into.php

tu y trouveras notamment la syntaxe du insert into select.

pour ton cas, il est vrai qu'une procédure stockée serait plus simple.


en trois étapes :

avec une variable (@id_keywords)

1 : recuperer l'id de 'keywords'

2 : si nombre de lignes retournées = 0 faire un insert dans keywords et conserver l'id géneré dans une variable / sinon recuperer la valeur dans la variable

3 : enfin faire l'insert dans url_keywords en utilisant la variable

je pense pas que ce soit ce qu'il y ai de plus efficace mais si tu décomposes le problème, c'est plus simple à résoudre.
0