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

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

Méthode(s) de connexion SQL ?!

n°1784374
grosbin
OR die;
Posté le 09-09-2008 à 12:17:10  profilanswer
 

Reprise du message précédent :
Moi qui croyait prêcher dans le désert à une certaine époque ..
détournement de topic, je cherche à optimiser cette requete ( le traitement gère plus d'un milier d'enregistrements similaires )

Code :
  1. SELECT SQL_CACHE id,Reste,Terrain,Agrement FROM SpeMed WHERE id IN (1171,1157,1169,1215,1223) AND Reste>0 ORDER BY case id when 1171 then 1 when 1157 then 2 when 1169 then 3 when 1215 then 4 when 1223 then 5 end


 - J'ai une table "internes" qui contient les voeux des personnes ( les identifiants listés dans l'ordre ), ce qui correspond au id in(x,y,z), dont le Reste>0 order by case id (ouch)
> mon but et d'obtenir le premier voeux dont le reste > 0 dans l'ordre des voeux de la personne et raccourcir au maximum les requetes
le Must serait de tout passer via Sql, autant rêver :D

 

Une fois une correspondance trouvé j'update le "SpeMed.Reste=SpeMed.Reste-1"
et ça mouline pour plus de 1000 personnes à chaque fois ..

 

Qq'un dispose d'une belle lanterne ?


Message édité par grosbin le 09-09-2008 à 12:21:36

---------------
Photos Panoramiques Montagnes Haute Savoie
mood
Publicité
Posté le 09-09-2008 à 12:17:10  profilanswer
 

n°1784400
omega2
Posté le 09-09-2008 à 12:43:24  profilanswer
 

grosbin > Avec mysql (non testé) :  

Citation :

SELECT SQL_CACHE id,Reste,Terrain,Agrement, FIELD(id,1171,1157,1169,1215,1223) SonOrdre
FROM SpeMed WHERE id IN (1171,1157,1169,1215,1223) AND Reste>0 ORDER BY SonOrdre

Si j'ai bien compris l'optimisation que tu voulais ça doit être ça.
Si le contenu du IN est le résultat d'une requête que tu veux inclure dans ta requête alors tu peux utiliser FIND_IN_SET au lieu de FIELD.
 
Voir doc : http://dev.mysql.com/doc/refman/5. [...] tions.html

n°1784412
grosbin
OR die;
Posté le 09-09-2008 à 12:54:27  profilanswer
 

ouch ça m'a l'air assze hardcore voici L'imbrication dégueulasse :D

Code :
  1. $x=sql("SELECT SQL_CACHE id,login,voeux,rang from internes where voeux<>'' order by rang asc" );
  2. while($t=@mysql_fetch_assoc($x)){
  3.   $i=0;$cle=$cle2="";#Reset des clés
  4.   $voeuxA=explode(",",$t[voeux]);
  5.   //id in (455,344,355,688,992,123,345) => priorité
  6.   foreach($voeuxA as $k=>$v){
  7.     if($v){$i++;
  8.     $cle2.="$v,"; // pour le champ in
  9.     $cle.="when $v then $i "; // pour le case id
  10.     }
  11.   }
  12.   $cle2=substr($cle2,0,-1);
  13.   $x2=sql("SELECT SQL_CACHE id,Reste,Terrain,Agrement FROM SpeMed WHERE id IN ($cle2) AND Reste>0 ORDER BY case id $cle end limit 1" );



Message édité par grosbin le 09-09-2008 à 12:56:14

---------------
Photos Panoramiques Montagnes Haute Savoie
n°1784423
omega2
Posté le 09-09-2008 à 13:15:27  profilanswer
 

Sauf erreur, si $P[x] ne change pas d'une personne à l'autre et si on récupère tous les choix de chaque personne, la requête donnerait :

Citation :

SELECT SQL_CACHE internes.id,login,voeux,rang,max($P[x]_agr.id) id_agr,Reste,Terrain,Agrement,FIND_IN_SET($P[x]_agr.id,rang)
 from internes,$P[x]_agr  
 where  voeux<>''  
  AND Reste>0
  AND FIND_IN_SET(id,rang)>0
 order by rang asc


J'essaierai de te rajouter tout à l'heure ce qu'il faut pour n'avoir que le plus petit des choix de chaque personne. Après, il faudra que tu vérifie ce qui est le plus rapide entre ce que t'avais fait toi, cette requête avec un peu de php pour ne traiter que les bonnes lignes ou la requête que je vais essayer de te faire tout à l'heure et qui te retournera les données déjà filtré.


Message édité par omega2 le 09-09-2008 à 13:16:24
n°1784475
grosbin
OR die;
Posté le 09-09-2008 à 14:46:05  profilanswer
 

Après Reformulation ..
 
SELECT SQL_CACHE I.id,I.login,I.voeux,I.rang,A.Reste,A.Terrain,A.Agrement,A.id,FIND_IN_SET(I.voeux,A.id) from Lyon_internes I,Lyon_agr A where I.voeux<>'' AND A.Reste>0 AND I.voeux like(A.id)group by rang order by I.rang asc
 
le find_in_set retourne 1 seulement si I.voeux=A.id
 
si je procède par la sorte, je ne peux modifier A.Reste avant de passer au prochain enregistrement aussi ..
donc soit en la formulant avec les limites qui s'incrémentent ???


---------------
Photos Panoramiques Montagnes Haute Savoie
n°1784545
grosbin
OR die;
Posté le 09-09-2008 à 15:54:26  profilanswer
 

[edit]ok j'ai pigé le concept

Code :
  1. SELECT SQL_CACHE I.id,A.RangLimite,I.login,I.voeux,A.id,A.Reste,FIND_IN_SET(A.id,I.voeux)as Ben,I.affectid,I.rang,I.affect,A.Terrain,A.Agrement from internes I,agr A where I.voeux<>'' AND A.Reste>0 AND FIND_IN_SET(A.id,I.voeux)>0 order by I.rang asc,Ben asc

Tout ok, meme checksum quand je print les résultats de l'algo :)
+ 2000 requetes en 15 sec sur une vieille brelle c'est cool :D


Message édité par grosbin le 09-09-2008 à 17:14:06

---------------
Photos Panoramiques Montagnes Haute Savoie
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[SQL] Oubli auto_increment sur IDediteur SQL pour Access
Executer du php dans du SQL ?Problème avec windev et SQL
Requete SQL Datetime[SQL]trié plusieur count dans une requete union
[SQL] mailing et newsletterException PL/SQL
[SQL] deux count dans une requette[VBA] requete SQL dans un programme VB pour publipostage vers word
Plus de sujets relatifs à : Méthode(s) de connexion SQL ?!


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