[PHP/MYSQL]Requêtes multiples

Requêtes multiples [PHP/MYSQL] - PHP - Programmation

Marsh Posté le 10-10-2011 à 16:41:56    

Bonjour,
 
J'ai le problème suivant : j'ai une table contenant des données, un score, une colonne rang
 
Cette table étant écrite très peu souvent, je fais un calcul du rang de manière statique (ce qui me permet également, d'avoir un rang "global", malgré des filtrages éventuels sur ma requête).
Bref, le problème n'est pas là, puisque je réussis à faire cette requête parfaitement ... dans phpmyadmin
 
Le problème vient alors du passage en php
En effet, ma requête est en fait une requete double :
tout d'abord j'initialise mes variables :

Code :
  1. SET @rank := 0, @num := 0, @prev:=NULL


 
Puis je fais ma deuxième requête qui est la requête de mise à jour à proprement parler.
 
Bon le problème c'est que comme c'est une requête multiple, je fais ça en deux fois dans php (j'appelle deux fois mysql_query, une fois pour chaque requête).
Et lorsque je lance ma seconde requête, il fait comme si je n'avais jamais fait la première, ce qui est relativement embêtant ;)
 
Bref, sauriez vous comment résoudre le problème ?
Je pensais aller jeter un coup d'oeil du côté des transactions, mais il me semble que c'est à utiliser que lorsque l'on a deux "vraies" requêtes à faire (et je n'ai aucune idée quant à savoir si ca changerait mon problème avec php)
 
Merci d'avance !

Reply

Marsh Posté le 10-10-2011 à 16:41:56   

Reply

Marsh Posté le 10-10-2011 à 17:45:34    

Il fait quoi, ton rang? Il ordonne juste en fonction du score? Si oui, ça doit pouvoir se faire d'un coup, non?
Une connerie de ce style?

 
Code :
  1. UPDATE matable t1 SET rang = (SELECT count(*) FROM matable t2 WHERE t2.score > t1.score) +1;


Message édité par skeye le 10-10-2011 à 17:47:43

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 10-10-2011 à 17:52:33    

Oui mon rang ordonne simplement en fonction du score.

 

C'est vrai que je peux peut être le faire avec une seule requête. Je crains un peu la complexité du calcul cependant, parce qu'on travaille sur une table comportant plusieurs millions d'enregistrements ...

 

Enfin en tout état de cause je récupère un You can't specify target table 't1' for update in FROM clause

Message cité 1 fois
Message édité par nisalon_caje le 10-10-2011 à 17:54:36

---------------
http://nisalon.labrute.com/
Reply

Marsh Posté le 10-10-2011 à 18:02:14    

nisalon_caje a écrit :

Oui mon rang ordonne simplement en fonction du score.

 

C'est vrai que je peux peut être le faire avec une seule requête. Je crains un peu la complexité du calcul cependant, parce qu'on travaille sur une table comportant plusieurs millions d'enregistrements ...

 

Bof, c'est pas bien lourd de faire un count()...pour peu qu'il y ait un index sur ta colonne score ça doit pouvoir rouler.

 
nisalon_caje a écrit :

Enfin en tout état de cause je récupère un You can't specify target table 't1' for update in FROM clause


Message d'erreur surprenant...m'enfin je connais pas bien mysql.[:doc petrus]
Ca a l'air connu comme problème, avec un workaround bien laid: http://www.xaprb.com/blog/2006/06/ [...] -in-mysql/


Message édité par skeye le 10-10-2011 à 18:02:59

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 10-10-2011 à 18:32:21    

ok je vais lire ça.

 

Mais serait-il néanmoins possible de faire avec la méthode que je souhaitais au début (c'est à dire deux requêtes, et que les variables ne soient pas "perdues" entre les deux requêtes).
(non que je sois têtu, si votre solution marche en un temps acceptable, je l'utiliserai ; mais par curiosité j'aimearis savoir comment éviter que mes variables ne disparaissent le temps de quelques requêtes)


Message édité par nisalon_caje le 10-10-2011 à 18:35:00

---------------
http://nisalon.labrute.com/
Reply

Marsh Posté le 10-10-2011 à 19:01:35    

en fait j'avais oublié une contrainte :)
les scores sont tels qu'il n'y a que très peu d'égalité entre les scores... (nombres décimaux sur [0;1 000 000])
Aussi, il est difficile d'avoir un index efficace (car chaque "groupement" a une taille de 1 grosso modo)

 

(d'ailleurs étrangement j'ai refait la requête que vosu avez indiqué et elle décide de fonctionner maintenant ...)


Message édité par nisalon_caje le 10-10-2011 à 19:04:50

---------------
http://nisalon.labrute.com/
Reply

Marsh Posté le 11-10-2011 à 15:36:22    

Solution pour faire des requêtes sql multiples : http://www.manuelphp.com/php/funct [...] -query.php


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 11-10-2011 à 16:05:46    

ok merci, je vais regarder ça.
Mais je vois que cela utilise des fonctions "mysqli"
 
Dois-je établir une seconde connexion à ma base de données, sachant que pour le moment je m'y suis connecté par la fonction mysql_connect ?


---------------
http://nisalon.labrute.com/
Reply

Marsh Posté le 11-10-2011 à 16:22:04    

Si c'est pas trop long, tu passes tout en mysqli.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 11-10-2011 à 16:37:02    

pourriez vous rapidement m'expliquer les différences ? :)


---------------
http://nisalon.labrute.com/
Reply

Marsh Posté le 11-10-2011 à 16:37:02   

Reply

Marsh Posté le 12-10-2011 à 09:01:40    

c'est une autre lib permettant de se connecter à une BD mysql et fait des choses en plus que la lib de base ne fait pas...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

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