Petit soucis de syntaxe SQL... Je paye ma soeur pour une solution!

Petit soucis de syntaxe SQL... Je paye ma soeur pour une solution! - SQL/NoSQL - Programmation

Marsh Posté le 10-08-2006 à 15:13:10    

Bonjour à tous,
 
Je m'excuse d'avance pour le dérangement si ma question est conne, mais j'ai une requête SQL à faire passer dans phpmyadmin pour l'administration d'un forum, requête qui est la suivante :
 

Code :
  1. INSERT INTO `phpbb_smilies_tmp`
  2. SELECT s.smilies_id, (SELECT MIN(smilies_id) FROM `phpbb_smilies` s2 WHERE s2.emoticon = s.emoticon)
  3. FROM `phpbb_smilies` s;


 
Et je me fais jeter, apparemment au niveau du SELECT MIN(...
 
Voilà le code de l'erreur :

Code :
  1. #1064 - 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 'SELECT MIN( smilies_id )
  2. FROM  `phpbb_smilies` s2
  3. WHERE s2.emo


 
Je n'ai pas bien compris le rôle de la virgule entre les 2 SELECTS, peut être que vous saurez éclairer ma lanterne, en tout cas merci d'avance! :hello:


Message édité par meatpuppet le 10-08-2006 à 16:03:04
Reply

Marsh Posté le 10-08-2006 à 15:13:10   

Reply

Marsh Posté le 10-08-2006 à 15:55:35    

Mon dieu pourtant je googlise tout ce que je peux, ça a l'air limite exotique comme instruction... Pitié, j'offre ma soeur à qui m'aidera [:sisicaivrai]

Reply

Marsh Posté le 10-08-2006 à 16:05:36    

dis-nous ce que tu veux faire, ça sera plus simple :o

Reply

Marsh Posté le 10-08-2006 à 16:08:16    

pains-aux-raisins a écrit :

dis-nous ce que tu veux faire, ça sera plus simple :o


 
Il s'agit d'une modification "modifiée" ( :whistle: ) visant à améliorer la présentation des smilies sur un forum phpbb. Le code complet SQL qui m'a été gentillement procuré est le suivant :
 

Code :
  1. CREATE TABLE `phpbb_smilies_groups` (
  2.   `group_id` smallint(5) unsigned NOT NULL auto_increment,
  3.   `name` varchar(50) default NULL,
  4.   `cols` smallint(5) unsigned default '9',
  5.   `width` smallint(5) unsigned default '400',
  6.   `height` smallint(5) unsigned default '300',
  7.   `sort_key` smallint( 5 ) default '0',
  8.   UNIQUE KEY `name` (`name`),
  9.   PRIMARY KEY ( `group_id` )
  10. );
  11. ALTER TABLE `phpbb_smilies` ADD `smile_group` SMALLINT( 5 ) UNSIGNED DEFAULT '0';
  12. ALTER TABLE `phpbb_smilies` ADD `sort_key` SMALLINT( 5 ) NOT NULL ;
  13. INSERT INTO `phpbb_smilies_groups` ( `group_id` , `name` , `cols` , `width` , `height` , `sort_key` )
  14. VALUES ('1', 'Basic', '9', '400', '350' , '1' );
  15. UPDATE `phpbb_smilies`
  16. SET smile_group = '1'
  17. WHERE smile_group = '0';
  18. INSERT INTO `phpbb_config` ( `config_name` , `config_value` )
  19. VALUES ('smilies_default_group', 'Basic'),
  20.        ('smilies_inline_columns', '4'),
  21.        ('smilies_inline_rows', '5'),
  22.        ('smilies_window_columns', '9'),
  23.        ('smilies_window_width', '400'),
  24.        ('smilies_window_height', '300');
  25. CREATE TABLE `phpbb_smilies_tmp` (
  26. `id` SMALLINT( 5 ) NOT NULL ,
  27. `key` SMALLINT( 5 ) NOT NULL
  28. );
  29. INSERT INTO `phpbb_smilies_tmp`
  30. SELECT s.smilies_id, (SELECT MIN(smilies_id) FROM `phpbb_smilies` s2 WHERE s2.emoticon = s.emoticon)
  31. FROM `phpbb_smilies` s;
  32. UPDATE `phpbb_smilies` s
  33. SET s.sort_key = ( SELECT t.key FROM `phpbb_smilies_tmp` t WHERE t.id = s.smilies_id )
  34. WHERE 1;
  35. DROP TABLE `phpbb_smilies_tmp`;


 
La première partie du code ne pose aucun problème et ajoute simplement des champs à certains trucs et des tables. Le problème se situe donc à l'avant-avant dernière instruction, qui elle ne passe pas, visiblement pour un problème de syntaxe.
Cela pourrait être lié à un problème de version, le code qu'on m'a procuré étant relativement vieux.


Message édité par meatpuppet le 10-08-2006 à 16:08:50
Reply

Marsh Posté le 10-08-2006 à 16:19:12    

Bonjour,dans l'instruction WHERE s2.emoticon = s.emoticon,essaie de remplacer la dernière partie par  's.emoticon',
dis moi le resultat
Bye

Reply

Marsh Posté le 10-08-2006 à 16:32:23    

la ligne 41 , il manque pas une condition ?

Reply

Marsh Posté le 10-08-2006 à 17:24:31    

lebienestrare a écrit :

Bonjour,dans l'instruction WHERE s2.emoticon = s.emoticon,essaie de remplacer la dernière partie par  's.emoticon',
dis moi le resultat
Bye


 
Merci beaucoup pour ton attention.
 
J'ai fait ce que tu m'as conseillé, le message d'erreur a légèrement changé du coup :
 

Code :
  1. #1064 - 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 'SELECT MIN( smilies_id )
  2. FROM  `phpbb_smilies` s2
  3. WHERE s2.emo


 
EDIT: Autant pour moi, y'a rien qu'a changé [:ddr555]


Message édité par meatpuppet le 10-08-2006 à 17:25:08
Reply

Marsh Posté le 11-08-2006 à 13:13:09    

petit up  :bounce:

Reply

Marsh Posté le 11-08-2006 à 13:26:58    

meat > Avant de balancer ta requete INSERT, essaie de voir ce que ça donne juste avec le SELECT dans l'interpréteur de requête MySQL.

Reply

Marsh Posté le 11-08-2006 à 14:43:16    

Essaye
 
INSERT INTO `phpbb_smilies_tmp` SELECT s.smilies_id AS id, (SELECT MIN(smilies_id) FROM `phpbb_smilies` s2 WHERE s2.emoticon = s.emoticon) AS key    FROM `phpbb_smilies` s;
 
Pas sur que ce soit ça mais sinon je vois pas...

Message cité 1 fois
Message édité par darkfrost le 11-08-2006 à 14:43:31
Reply

Marsh Posté le 11-08-2006 à 14:43:16   

Reply

Marsh Posté le 12-08-2006 à 12:39:59    

pains-aux-raisins a écrit :

meat > Avant de balancer ta requete INSERT, essaie de voir ce que ça donne juste avec le SELECT dans l'interpréteur de requête MySQL.


 
Le SELECT seul me renvoie pile la même erreur.

Reply

Marsh Posté le 12-08-2006 à 12:40:59    

darkfrost a écrit :

Essaye
 
INSERT INTO `phpbb_smilies_tmp` SELECT s.smilies_id AS id, (SELECT MIN(smilies_id) FROM `phpbb_smilies` s2 WHERE s2.emoticon = s.emoticon) AS key    FROM `phpbb_smilies` s;
 
Pas sur que ce soit ça mais sinon je vois pas...


 
Ca me donne la même erreur, le "MIN(" s'affiche en rouge dans le résumé de la requête, et il affiche ça :
 

Code :
  1. #1064 - 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 'SELECT MIN( smilies_id )
  2. FROM  `phpbb_smilies` s2
  3. WHERE s2.emo


 
Ce qui après vérification est la même erreur :/


Message édité par meatpuppet le 12-08-2006 à 12:53:47
Reply

Marsh Posté le 12-08-2006 à 15:33:36    

pains-aux-raisins a écrit :

meat > Avant de balancer ta requete INSERT, essaie de voir ce que ça donne juste avec le SELECT dans l'interpréteur de requête MySQL.


 
J'ai retenté juste à partir du 2ème SELECT, et il me jette avec l'erreur suivante :  
 

Code :
  1. #1109 - Unknown table 's' in where clause


 

Reply

Marsh Posté le 12-08-2006 à 15:43:27    

Sinon, j'ai retrouvé un vieux thread où des gens ont le même problème, avec le même code ou presque, mais l'alphabet utilisé (du cyrillique ? :D ) me fait dire que ça va être coton de comprendre ce qu'ils disent...
 
http://www.phpbbguru.net/community/topic9893.html

Reply

Marsh Posté le 12-08-2006 à 16:27:55    

on peut voir une tof de la soeur ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 12-08-2006 à 18:28:01    

Harkonnen a écrit :

on peut voir une tof de la soeur ?


 
 :lol:

Reply

Marsh Posté le 12-08-2006 à 19:13:24    

Harkonnen a écrit :

on peut voir une tof de la soeur ?


 
La tof après la solution  :p  
 
On lui a dit plusieurs fois qu'elle ressemble à Emmanuelle Béart...

Reply

Marsh Posté le 12-08-2006 à 21:30:33    

meatpuppet a écrit :

La tof après la solution  :p  
 
On lui a dit plusieurs fois qu'elle ressemble à Emmanuelle Béart...


 
SELECT s.smilies_id, (SELECT MIN(smilies_id)  
                            FROM `phpbb_smilies` s2  
                            WHERE s2.emoticon = s.emoticon)    
FROM `phpbb_smilies` s;
 
le problème qu'il y a avec cette requête c'est que dans "MIN(smilies_id)" il sait pas ou il doit allé chercher le "smilies_id" (soit dans 's' soit dans 's2') d'où ton erreur
 
SELECT s.smilies_id, (SELECT MIN(s2.smilies_id)  
                            FROM `phpbb_smilies` s2  
                            WHERE s2.emoticon = s.emoticon)    
FROM `phpbb_smilies` s;
 
a mon avis ça devrait solutionné ton problème. D'ailleur je ne comprends pas comment ça se fait que personne d'autre l'ai remarqué avant moi.
 
EDIT: si ça marche, je veux ta soeur :D :D :D :D


Message édité par moi23372 le 12-08-2006 à 21:31:57
Reply

Marsh Posté le 13-08-2006 à 13:56:49    

Merci pour ton aide, mais j'crois que pour l'instant ma soeur reste libre :whistle
 
En fait il me balance la même erreur, toujours pareil... A croire que c'est le smilies_id qui déconne, genre ça s'apelle plus comme ça, ou c'est un type de variable dont on peut pas prendre le min()...
 
J'crois que je vais abandonner :/

Reply

Marsh Posté le 13-08-2006 à 14:02:26    

bon avant d'abandonner teste ceci:
 
SELECT s2.smilies_id
FROM `phpbb_smilies` s2  
 
et
 
SELECT MIN(s2.smilies_id)  
FROM `phpbb_smilies` s2  
 
dit moi si ça te renvoit quelque chose
teste aussi ceci
sinon tu peux également nous donné la structure de la table phpbb_smilies avec le nom des champs et le type de chacun de ceux-ci...
Après ça on pourra surement t'en dire plus.
 

Reply

Marsh Posté le 13-08-2006 à 14:04:02    

Le mec qui m'a fourni le code me dit qu'il faut que j'update ma version de MySQL pour qu'elle soit au moins en 4.X ou 5.X... Je viens d'acheter mon hébergement chez OVH, c'est quoi la version qu'ils m'ont mis ? :??:
 
Ca va peut être vous aider à traduire la requête, non ? Merci d'avance et pour tout :hello:
 
EDIT : J'ai la version 4.0.25 de MySQL, ça me paraît un peu gros un tel problème de compatibilité...


Message édité par meatpuppet le 13-08-2006 à 14:19:14
Reply

Marsh Posté le 13-08-2006 à 14:06:02    

moi23372 a écrit :

bon avant d'abandonner teste ceci:
 
SELECT s2.smilies_id
FROM `phpbb_smilies` s2  
 
et
 
SELECT MIN(s2.smilies_id)  
FROM `phpbb_smilies` s2  
 
dit moi si ça te renvoit quelque chose
teste aussi ceci
sinon tu peux également nous donné la structure de la table phpbb_smilies avec le nom des champs et le type de chacun de ceux-ci...
Après ça on pourra surement t'en dire plus.


 
La première requête que tu dis me renvoie une liste, avec en en-tête ça :
Affichage des enregistrements 0 - 29 (212 total, traitement: 0.0434 sec.)
 
La seconde, me renvoie ça :  
Affichage des enregistrements 0 - 0 (1 total, traitement: 0.0004 sec.)
Avec une liste beaucoup plus courte, puisqu'elle ne compte qu'une seule entrée.
 
Tu veux plus de détails ?  

Reply

Marsh Posté le 13-08-2006 à 14:07:15    

Ma table phpbb_smilies compte les entrées suivantes :
 
smilies_id (smallint(5)), code (varchar), smilie_url (varchar), emoticon (varchar), smilies_order (int(5)), smile_group (smallint(5)) et sort_key (smallint(5))
 
Concernant la table phpbb_smilies_tmp, j'ai que les entrées suivantes :
 
id (smallint(5)), key (smallint(5))
 
La table tmp est créée par les premières commandes et ne comporte en principe que ces entrées, là je pense que c'est normal


Message édité par meatpuppet le 13-08-2006 à 14:12:11
Reply

Marsh Posté le 13-08-2006 à 14:49:11    

Chez OVH tu n'as pas le droit aux select imbriquée, car la version de MySQL est trop ancienne
Bon voilà tu as eu ta réponse : c'est po possible :p payes ta soeur maintenant ;)

Reply

Marsh Posté le 13-08-2006 à 14:57:32    

couak a écrit :

Chez OVH tu n'as pas le droit aux select imbriquée, car la version de MySQL est trop ancienne
Bon voilà tu as eu ta réponse : c'est po possible :p payes ta soeur maintenant ;)


 
Mais j'ai aucun moyen de réaliser cette requête alors ? :??:
genre en deux temps, je sais pas moi...
 
Ah pas de solution, pas de soeur :p
 
Apparemment c'est faisable en passant par une table temporaire, ou alors en utilisant l'instruction JOIN...


Message édité par meatpuppet le 13-08-2006 à 16:00:49
Reply

Marsh Posté le 13-08-2006 à 16:23:07    

Sur cette page, il y'a un exemple intéressant... Mais je crains de faire une connerie en adaptant mon code :/  
 
Si un habitué du SQL passe par là, ça devrait n'être qu'une simple formalité pour lui, au vu de l'exemple :  
 
    *  Avec des tables temporaires.
 
Pour les requêtes plus complexes, on crée une table temporaire où on insère les enregistrements qu'aurait normalement contenus la sous-requête. Puis on fait une jointure entre la table temporaire et la table d'origine.
 
Ex : pour chaque valeur de champ2, on veut le maximum de champ1 dans la table.

Code :
  1. SELECT * FROM table1
  2.   WHERE champ1 IN
  3.   ( SELECT max(champ1) FROM table1
  4.   GROUP BY champ2 )


 
Devient :
 

Code :
  1. CREATE TEMPORARY TABLE table_temp (
  2.  Champ2 [type],
  3.  Maximum [type]
  4. );
  5. LOCK TABLES table1 READ;
  6. INSERT INTO table_temp SELECT champ2, MAX(champ1) FROM table1 GROUP BY champ2;
  7. SELECT table1.* FROM table1, table_temp
  8.  WHERE table1.champ2=table_temp.champ2 AND table1.champ1=table_temp.maximum;
  9. UNLOCK TABLES;
  10. DROP TABLE table_temp;

Reply

Marsh Posté le 14-08-2006 à 10:18:10    

pas mal le coup des 20 posts pour se rendre compte que la version de MySQL ne supportait pas les requetes imbriquees (4.1.9 et plus)
 
il y a toujours un moyen de s en sortir sans requetes imbriquees
peux tu reexpliquer precisement le but de ta manoeuvre (avec un petit exemple stp ?)

Reply

Marsh Posté le 14-08-2006 à 10:21:21    

[:rofl2]

Reply

Marsh Posté le 14-08-2006 à 10:42:56    

betsamee a écrit :

pas mal le coup des 20 posts pour se rendre compte que la version de MySQL ne supportait pas les requetes imbriquees (4.1.9 et plus)
 
il y a toujours un moyen de s en sortir sans requetes imbriquees
peux tu reexpliquer precisement le but de ta manoeuvre (avec un petit exemple stp ?)


 
Et bien je suis pas encore capable de t'expliquer clairement ce que mon code fait, vu que je n'ai pas de grandes connaissances de MySQL (d'où le coup des 20 posts, au cours desquels tu auras remarqué que j'avançais petit à petit dans mon problème, après une multitude de mails et/ou googlisations effectuées).
 
Ce code m'a été fourni par une tierce personne, et ce qui déconne c'est l'instruction suivante :
 
INSERT INTO `phpbb_smilies_tmp`
    SELECT s.smilies_id, (SELECT MIN(smilies_id) FROM `phpbb_smilies` s2 WHERE s2.emoticon = s.emoticon)
    FROM `phpbb_smilies` s;
 
Cette instruction vise, je pense, à mettre des objets de la table phpbb_smilies dans la table phpbb_smilies_tmp, avant l'instruction d'après, qui réorganise le tout... C'est encore obscur, désolé. Je continue à chercher

Reply

Marsh Posté le 14-08-2006 à 10:54:46    

essaies cela stp

Code :
  1. INSERT INTO `phpbb_smilies_tmp`
  2. select s.smilies_id,min(s2.smilies_id)
  3. from `phpbb_smilies` s inner join `phpbb_smilies` s2 on s.emoticon = s2.emoticon
  4. group by s.smilies_id


Message édité par betsamee le 14-08-2006 à 10:55:28
Reply

Marsh Posté le 15-08-2006 à 10:02:03    

Merci betsamee, mais j'ai finalement reçu une solution de la part d'un type qui, comme moi, avait exactement le même problème.
 
J'ai trouvé son thread sur un forum russe, je lui ai écrit par mail, et il m'a donné sa méthode, ce qui ma foi est plutot cool (le thread date d'il y'a 2 ans :lol: )  
 
Ce qui est cool aussi, c'est l'aide que j'ai trouvée ici. Merci à tous les gars, je paierai pas ma soeur finalement (le voulais-je réellement :whistle: ) !
 
Pour info, c'est donc un problème d'incompatibilité de MySQL version <4.1, qui n'accepte pas les requêtes imbriquées. Il fallait donc soit adapter le code, soit prendre une toute autre approche pour l'installation de la modification du forum. J'ai adopté la seconde solution, qui incluait l'effacement complet des 350 smileys que compte mon forum, et réinstallation ultérieure (ouch). Moins pratique, mais moins technique aussi.
 
Merci encore :hello:

Reply

Marsh Posté le 15-08-2006 à 10:40:48    

moralité : tu vas envoyer ta soeur en russie ? :)

Reply

Marsh Posté le 15-08-2006 à 10:42:56    

pour l'histoire des requêtes imbriquées, pour OVH j'ai été assez décu car avant de choisir un hébergeur j'avais bien regardé les descriptions techniques des offres, et OVH stipulait une version 4 de MySQL : ce n'est pas un mensonge, mais il aurait pu au moins spécifier la version mineure
 
Ce n'est qu'après avoir testé sur OVH que je m'étais rendu compte de la version de mysql :/ j'avais du réadapter toutes mes requêtes

Reply

Marsh Posté le 15-08-2006 à 11:25:44    

couak a écrit :

pour l'histoire des requêtes imbriquées, pour OVH j'ai été assez décu car avant de choisir un hébergeur j'avais bien regardé les descriptions techniques des offres, et OVH stipulait une version 4 de MySQL : ce n'est pas un mensonge, mais il aurait pu au moins spécifier la version mineure
 
Ce n'est qu'après avoir testé sur OVH que je m'étais rendu compte de la version de mysql :/ j'avais du réadapter toutes mes requêtes


en mutualise OVH donne une version de MySQL < 4.1.9 ???  :ouch:  
nous sommes chez eux en dedie pour un de nos sites et nous avons du d'emblee changer la version de MySQL (3 quelquechose, une honte!)
Bref MySQL sans les requetes imbriquees ca vaut pas grand chose et je n imagine plus trop en passer
 
En dehors de ca je pense que ma solution marche donc je veux ta soeur clone de emmanuelle beart

Reply

Marsh Posté le 15-08-2006 à 11:59:57    

bin non c'est du 4 par défaut chez OVH maintenant.

Reply

Marsh Posté le 15-08-2006 à 15:23:10    

betsamee a écrit :

en mutualise OVH donne une version de MySQL < 4.1.9 ???  :ouch:  
nous sommes chez eux en dedie pour un de nos sites et nous avons du d'emblee changer la version de MySQL (3 quelquechose, une honte!)
Bref MySQL sans les requetes imbriquees ca vaut pas grand chose et je n imagine plus trop en passer
 
En dehors de ca je pense que ma solution marche donc je veux ta soeur clone de emmanuelle beart


 
Comme je n'ai pas essayé ta requête, et que maintenant vu que tout marche je ne risque pas de l'essayer (j'ai trop peur que ça fasse une couille, excuse moi mais j'y connais rien moi :D ), je vais te laisser le bénéfice du doute, on va dire que ta requête marchait.  
 
A présent si tu veux bien, il faudrait me fournir les informations suivantes, c'est pour ma soeur :
 
Nom, prénom
Age
Taille / Poids
Couleur des cheveux
Couleur des yeux
Mensurations (toutes celles que tu jugeras utiles)
Statut / Nombre d'enfants (reconnus ou non)
Loisirs (hormis informatique)
 
Ma soeur étudiera ton dossier et t'enverra une réponse sous peu :whistle:
 
C'est bon, là, j'ai bien botté en touche ? :whistle:

Reply

Marsh Posté le 15-08-2006 à 17:41:06    

t'as super bien botté en touche : dans un forum d'informaticiens, le fait de demander "loirsirs hormis informatique" t'as permis de virer la moitié des prétendants :D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed