Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
886 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP/MYSQL]Requêtes multiples

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP/MYSQL]Requêtes multiples

n°2105597
nisalon_ca​je
Posté le 10-10-2011 à 16:41:56  profilanswer
 

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 !

mood
Publicité
Posté le 10-10-2011 à 16:41:56  profilanswer
 

n°2105619
skeye
Posté le 10-10-2011 à 17:45:34  profilanswer
 

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 -
n°2105621
nisalon_ca​je
Posté le 10-10-2011 à 17:52:33  profilanswer
 

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/
n°2105626
skeye
Posté le 10-10-2011 à 18:02:14  profilanswer
 

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 -
n°2105635
nisalon_ca​je
Posté le 10-10-2011 à 18:32:21  profilanswer
 

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/
n°2105643
nisalon_ca​je
Posté le 10-10-2011 à 19:01:35  profilanswer
 

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/
n°2105794
rufo
Pas me confondre avec Lycos!
Posté le 11-10-2011 à 15:36:22  profilanswer
 

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
n°2105799
nisalon_ca​je
Posté le 11-10-2011 à 16:05:46  profilanswer
 

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/
n°2105805
rufo
Pas me confondre avec Lycos!
Posté le 11-10-2011 à 16:22:04  profilanswer
 

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
n°2105808
nisalon_ca​je
Posté le 11-10-2011 à 16:37:02  profilanswer
 

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


---------------
http://nisalon.labrute.com/
mood
Publicité
Posté le 11-10-2011 à 16:37:02  profilanswer
 

n°2105882
rufo
Pas me confondre avec Lycos!
Posté le 12-10-2011 à 09:01:40  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [PHP/MYSQL]Requêtes multiples

 

Sujets relatifs
[PHP] Ouvrir un fichier sur un serveur distantProblème Tomcat / MYSQL / RMI
recherche champ minimum enregistrement mysqlProblème Session PHP
mysql IN()Petite code PHP à modif
Recherche un développeur PHP ObjetPassage en SPAM chez Hotmail avec Mail PHP
[MySQL] Jointure sur une meme tabledu PHP à JSON
Plus de sujets relatifs à : [PHP/MYSQL]Requêtes multiples


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR