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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Probleme et optimisation de requete

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme et optimisation de requete

n°1683613
darknewbie​31
Posté le 07-02-2008 à 20:08:33  profilanswer
 

Bonjour a tous,
 
Voila j'ai crée une page en php qui fait appel a plusieurs requêtes sql j'aimerais de l'aide afin d'optimiser mes requêtes et en réduire le nombre.
De plus, au lieu d'afficher mon enregistrement j'obtiens un "array" je pense que c'est du au nombre de mes requêtes, j'aimerais aussi résoudre ce problème.
 
Voila la partie de mon code qui me pose problème :

Code :
  1. $sql_mob = "SELECT * FROM `mob_db`
  2. WHERE left(iName,1) = '".$_GET["lettre"]."' ORDER by `iName` ASC ";
  3. $sql = mysql_query($sql_mob);
  4. while($resultat=mysql_fetch_assoc($sql)) {
  5. $item_db = mysql_query("SELECT * FROM `item_db` WHERE `id`=".$resultat['DropCardid'].";" );
  6. $itemdb[0] = mysql_fetch_assoc($item_db);
  7. $item_db = mysql_query("SELECT * FROM `item_db` WHERE `id`=".$resultat['Drop1id'].";" );
  8. $itemdb[1] = mysql_fetch_assoc($item_db);
  9. $item_db = mysql_query("SELECT * FROM `item_db` WHERE `id`=".$resultat['Drop2id'].";" );
  10. $itemdb[2] = mysql_fetch_assoc($item_db);
  11. $item_db = mysql_query("SELECT * FROM `item_db` WHERE `id`=".$resultat['Drop3id'].";" );
  12. $itemdb[3] = mysql_fetch_assoc($item_db);
  13. $item_db = mysql_query("SELECT * FROM `item_db` WHERE `id`=".$resultat['Drop4id'].";" );
  14. $itemdb[4] = mysql_fetch_assoc($item_db);
  15. $item_db = mysql_query("SELECT * FROM `item_db` WHERE `id`=".$resultat['Drop5id'].";" );
  16. $itemdb[5] = mysql_fetch_assoc($item_db);
  17. $item_db = mysql_query("SELECT * FROM `item_db` WHERE `id`=".$resultat['Drop6id'].";" );
  18. $itemdb[6] = mysql_fetch_assoc($item_db);
  19. $item_db = mysql_query("SELECT * FROM `item_db` WHERE `id`=".$resultat['Drop7id'].";" );
  20. $itemdb[7] = mysql_fetch_assoc($item_db);
  21. $item_db = mysql_query("SELECT * FROM `item_db` WHERE `id`=".$resultat['Drop8id'].";" );
  22. $itemdb[8] = mysql_fetch_assoc($item_db);
  23. $item_db = mysql_query("SELECT * FROM `item_db` WHERE `id`=".$resultat['Drop9id'].";" );
  24. $itemdb[9] = mysql_fetch_assoc($item_db);
  25. // Suivi d'un echo avec les données à afficher
  26. }


 
Tout marche mais la page est lente a afficher ( environ 20 sec ) de plus $itemdb[0] affiche "array".
 
Voila, merci d'avance de votre aide :)


Message édité par darknewbie31 le 07-02-2008 à 20:09:45
mood
Publicité
Posté le 07-02-2008 à 20:08:33  profilanswer
 

n°1683623
babasss
Posté le 07-02-2008 à 20:38:30  profilanswer
 

Utilise "IN" à la place de tes "="

Code :
  1. SELECT * FROM `item_db` WHERE `id` IN ('".$resultat['DropCardid']."','".$resultat['Drop1id']."','"......
 
darknewbie31 a écrit :

de plus $itemdb[0] affiche "array".


C'est normal, c'est toi qui lui demandes. Il te renvoie un Array avec toutes les colonnes de ta table dedans....

 


Message édité par babasss le 07-02-2008 à 20:40:13

---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
n°1683689
darknewbie​31
Posté le 07-02-2008 à 22:16:49  profilanswer
 

Donc si je comprend bien, IN selectionne tout les enregistrement egal au variable inclut dans ma parenthese ?
 
Excuse ma question un peu bete mais comment j'affiche le resultat ?

n°1683701
babasss
Posté le 07-02-2008 à 22:28:56  profilanswer
 

darknewbie31 a écrit :

Donc si je comprend bien, IN selectionne tout les enregistrement egal au variable inclut dans ma parenthèse ?


C'est bien ca
 

darknewbie31 a écrit :

Excuse ma question un peu bete mais comment j'affiche le resultat ?


Tu commences comme tu as fait avec mysql_fetch_assoc et tu le mets dans une boucle while. Ensuite tu parcours ton tableau pour afficher les résultats


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
n°1683706
darknewbie​31
Posté le 07-02-2008 à 22:37:41  profilanswer
 

Euh je suis pas sur que ca soit ce qui me convient ou alors j'ai mal compris.
 
voila mon code d'affichage :

Code :
  1. //Affichage de la carte et de la description :
  2. <tr>
  3.  <td colspan=\"5\" style=\"text-align:left;border-bottom:1px solid black\">Carte :<br>
  4.  <img src=\"./Modules/database/Images/items/card_icon.gif\" alt=\"\" border=\"0\"/>".$itemdb['10']." (".$resultat['DropCardper'] / 100 ." %)<br>
  5.  </td>
  6. </tr>
  7. // Affichage des items :
  8. <tr>
  9.  <td colspan=\"5\" style=\"text-align:left;border-bottom:1px solid black;\">Items :<br>";
  10.  if (!empty ($resultat['Drop1id'])) {
  11.   $mobdb .= "<img src=\"./Modules/database/Images/items/".$resultat['Drop1id'].".gif\" alt=\"\" border=\"0\"/>".$resultat['Drop1id']." (".$resultat['Drop1per'] / 100 ."%)<br>";
  12.  }
  13.  if (!empty ($resultat['Drop2id'])) {
  14.   $mobdb .= "<img src=\"./Modules/database/Images/items/".$resultat['Drop2id'].".gif\" alt=\"\" border=\"0\"/> ".$resultat['Drop2id']." (".$resultat['Drop2per'] / 100 ."%)<br>";
  15.  }
  16.  if (!empty ($resultat['Drop3id'])) {
  17.   $mobdb .= "<img src=\"./Modules/database/Images/items/".$resultat['Drop3id'].".gif\" alt=\"\" border=\"0\"/> ".$resultat['Drop3id']." (".$resultat['Drop3per'] / 100 ." %)<br>";
  18.  }
  19.  if (!empty ($resultat['Drop4id'])) {
  20.   $mobdb .= "<img src=\"./Modules/database/Images/items/".$resultat['Drop4id'].".gif\" alt=\"\" border=\"0\"/> ".$resultat['Drop4id']." (".$resultat['Drop4per'] / 100 ."%)<br>";
  21.  }
  22.  if (!empty ($resultat['Drop5id'])) {
  23.   $mobdb .= "<img src=\"./Modules/database/Images/items/".$resultat['Drop5id'].".gif\" alt=\"\" border=\"0\"/> ".$resultat['Drop5id']." (".$resultat['Drop5per'] / 100 ." %)<br>";
  24.  }
  25.  if (!empty ($resultat['Drop6id'])) {
  26.   $mobdb .= "<img src=\"./Modules/database/Images/items/".$resultat['Drop6id'].".gif\" alt=\"\" border=\"0\"/> ".$resultat['Drop6id']." (".$resultat['Drop6per'] / 100 ." %)<br>";
  27.  }
  28.  if (!empty ($resultat['Drop7id'])) {
  29.   $mobdb .= "<img src=\"./Modules/database/Images/items/".$resultat['Drop7id'].".gif\" alt=\"\" border=\"0\"/> ".$resultat['Drop7id']." (".$resultat['Drop7per'] / 100 ." %)<br>";
  30.  }
  31.  if (!empty ($resultat['Drop8id'])) {
  32.   $mobdb .= "<img src=\"./Modules/database/Images/items/".$resultat['Drop8id'].".gif\" alt=\"\" border=\"0\"/> ".$resultat['Drop8id']." (".$resultat['Drop8per'] / 100 ."%)<br>";
  33.  }
  34.  if (!empty ($resultat['Drop9id'])) {
  35.   $mobdb .= "<img src=\"./Modules/database/Images/items/".$resultat['Drop9id'].".gif\" alt=\"\" border=\"0\"/> ".$resultat['Drop8id']." (".$resultat['Drop9per'] / 100 ."%)<br>";
  36.  }


 
 
Pour l'affichage des items ( la partie avec les if ), ok je voit pour faire une boucle ... mais en prenant en compte l'affichage de la carte ( partie au dessus ), je voit pas vraiment comment faire à part faire en deux partie
 
En faisant comme ca ca marche par contre est-il possible de classer les resultats par "$resultat['DropXid']" ou x est le numero de l'enregistrement initial ?


Message édité par darknewbie31 le 07-02-2008 à 22:47:12
n°1684362
moi23372
Posté le 09-02-2008 à 11:54:01  profilanswer
 

utilises EXITS plutot que IN, c'est encore beaucoup plus performant. Attention juste à faire une jointure entre la query de premier niveau et celle enclu dans les parenthèse.

n°1684605
babasss
Posté le 10-02-2008 à 17:39:00  profilanswer
 

Je ne sais pas si c'est le week end qui fait ca mais je ne comprends rien du tout. Depuis le début, je te réponds au coup par coup aux problèmes que tu rencontres. Mais maintenant, afin de t'aider au mieux, il faudrait peut être expliquer en quoi consiste ton script et qu'elle est la structure de ta table....


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
n°1684636
darknewbie​31
Posté le 10-02-2008 à 20:07:01  profilanswer
 

Alors la tu a réussi a me perdre xD
 
Bon en faite j'ai ma base de données qui contient 2 table nécessaire a ce script. Le but est d'afficher les détails d'une de mes tables ( mob_db ) et de changer les "MVPid" ou "DropID" par l'enregistrement respectif dans item_db.
 
voila la stucture d'une table de ma BDD :

Code :
  1. CREATE TABLE `mob_db` (
  2.   `ID` mediumint(9) unsigned NOT NULL default '0',
  3.   `Sprite` text NOT NULL,
  4.   `kName` text NOT NULL,
  5.   `iName` text NOT NULL,
  6.   `LV` tinyint(6) unsigned NOT NULL default '0',
  7.   `HP` int(9) unsigned NOT NULL default '0',
  8.   `SP` mediumint(9) unsigned NOT NULL default '0',
  9.   `EXP` mediumint(9) unsigned NOT NULL default '0',
  10.   `JEXP` mediumint(9) unsigned NOT NULL default '0',
  11.   `Range1` tinyint(4) unsigned NOT NULL default '0',
  12.   `ATK1` smallint(6) unsigned NOT NULL default '0',
  13.   `ATK2` smallint(6) unsigned NOT NULL default '0',
  14.   `DEF` smallint(6) unsigned NOT NULL default '0',
  15.   `MDEF` smallint(6) unsigned NOT NULL default '0',
  16.   `STR` tinyint(4) unsigned NOT NULL default '0',
  17.   `AGI` tinyint(4) unsigned NOT NULL default '0',
  18.   `VIT` tinyint(4) unsigned NOT NULL default '0',
  19.   `INT` tinyint(4) unsigned NOT NULL default '0',
  20.   `DEX` tinyint(4) unsigned NOT NULL default '0',
  21.   `LUK` tinyint(4) unsigned NOT NULL default '0',
  22.   `Range2` tinyint(4) unsigned NOT NULL default '0',
  23.   `Range3` tinyint(4) unsigned NOT NULL default '0',
  24.   `Scale` tinyint(4) unsigned NOT NULL default '0',
  25.   `Race` tinyint(4) unsigned NOT NULL default '0',
  26.   `Element` tinyint(4) unsigned NOT NULL default '0',
  27.   `Mode` smallint(6) unsigned NOT NULL default '0',
  28.   `Speed` smallint(6) unsigned NOT NULL default '0',
  29.   `aDelay` smallint(6) unsigned NOT NULL default '0',
  30.   `aMotion` smallint(6) unsigned NOT NULL default '0',
  31.   `dMotion` smallint(6) unsigned NOT NULL default '0',
  32.   `MEXP` mediumint(9) unsigned NOT NULL default '0',
  33.   `ExpPer` smallint(9) unsigned NOT NULL default '0',
  34.   `MVP1id` smallint(9) unsigned NOT NULL default '0',
  35.   `MVP1per` smallint(9) unsigned NOT NULL default '0',
  36.   `MVP2id` smallint(9) unsigned NOT NULL default '0',
  37.   `MVP2per` smallint(9) unsigned NOT NULL default '0',
  38.   `MVP3id` smallint(9) unsigned NOT NULL default '0',
  39.   `MVP3per` smallint(9) unsigned NOT NULL default '0',
  40.   `Drop1id` smallint(9) unsigned NOT NULL default '0',
  41.   `Drop1per` smallint(9) unsigned NOT NULL default '0',
  42.   `Drop2id` smallint(9) unsigned NOT NULL default '0',
  43.   `Drop2per` smallint(9) unsigned NOT NULL default '0',
  44.   `Drop3id` smallint(9) unsigned NOT NULL default '0',
  45.   `Drop3per` smallint(9) unsigned NOT NULL default '0',
  46.   `Drop4id` smallint(9) unsigned NOT NULL default '0',
  47.   `Drop4per` smallint(9) unsigned NOT NULL default '0',
  48.   `Drop5id` smallint(9) unsigned NOT NULL default '0',
  49.   `Drop5per` smallint(9) unsigned NOT NULL default '0',
  50.   `Drop6id` smallint(9) unsigned NOT NULL default '0',
  51.   `Drop6per` smallint(9) unsigned NOT NULL default '0',
  52.   `Drop7id` smallint(9) unsigned NOT NULL default '0',
  53.   `Drop7per` smallint(9) unsigned NOT NULL default '0',
  54.   `Drop8id` smallint(9) unsigned NOT NULL default '0',
  55.   `Drop8per` smallint(9) unsigned NOT NULL default '0',
  56.   `Drop9id` smallint(9) unsigned NOT NULL default '0',
  57.   `Drop9per` smallint(9) unsigned NOT NULL default '0',
  58.   `DropCardid` smallint(9) unsigned NOT NULL default '0',
  59.   `DropCardper` smallint(9) unsigned NOT NULL default '0',
  60.   PRIMARY KEY  (`ID`)
  61. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;


 
Et voila pour les Items :

Code :
  1. CREATE TABLE `item_db` (
  2.   `id` smallint(5) unsigned NOT NULL default '0',
  3.   `name_english` varchar(50) NOT NULL default '',
  4.   `name_japanese` varchar(50) NOT NULL default '',
  5.   `type` tinyint(2) unsigned NOT NULL default '0',
  6.   `price_buy` mediumint(10) unsigned default NULL,
  7.   `price_sell` mediumint(10) unsigned default NULL,
  8.   `weight` smallint(5) unsigned NOT NULL default '0',
  9.   `attack` smallint(3) unsigned default NULL,
  10.   `defence` tinyint(3) unsigned default NULL,
  11.   `range` tinyint(2) unsigned default NULL,
  12.   `slots` tinyint(2) unsigned default NULL,
  13.   `equip_jobs` int(12) unsigned default NULL,
  14.   `equip_upper` tinyint(8) unsigned default NULL,
  15.   `equip_genders` tinyint(2) unsigned default NULL,
  16.   `equip_locations` smallint(4) unsigned default NULL,
  17.   `weapon_level` tinyint(2) unsigned default NULL,
  18.   `equip_level` tinyint(3) unsigned default NULL,
  19.   `refineable` tinyint(1) unsigned default NULL,
  20.   `view` smallint(3) unsigned default NULL,
  21.   `script` text,
  22.   `equip_script` text,
  23.   `unequip_script` text,
  24.   PRIMARY KEY  (`id`)
  25. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;


 
Après pour ce qui est du code php, c'est un simple tableau qui affiche mes enregistrement et j'utilise la solution énoncé plus haut avec le IN ( pour le moment ).
 
Le problème est que par la suite j'aurais des données d'un fichier texte a insérer (une description des mes Dropid)
De plus la requête va dépasser 30 sec, personne attendra 20 plombe pour afficher la page et voir la page planter car la requête est trop longue :/

n°1684637
couak
Posté le 10-02-2008 à 20:27:12  profilanswer
 

ben moi c'est simple, dès que je vois du code PHP illisible dans la catégorie SQL, je ne lis pas le code :o

n°1684643
darknewbie​31
Posté le 10-02-2008 à 20:52:35  profilanswer
 

ba justement ca ca n'est pas de moi et je ne peux le modifier. (ou alors il faut que je modifie les source d'un programe en entier ^^)
Tout ce qui est structure de la BDD ne peux etre modifier car un programe l'utilise.

mood
Publicité
Posté le 10-02-2008 à 20:52:35  profilanswer
 

n°1684823
babasss
Posté le 11-02-2008 à 13:37:44  profilanswer
 

Moi j'ai compris ca :  
"Tu selectionnes un id dans ta table mod_db, ca te renvoir 10 DropId (Card, 1, 2, 3, ..., 9) et tu veux afficher ta table item_db pour les ids correspondant aux 10 Dropid vu juste avant"
 
J'ai bon ? Sinon je vois pas vraiment ce que tu veux...
 
PS : A mon avis, c'est maintenant plus un pb de Php que SQL...


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
n°1685070
darknewbie​31
Posté le 11-02-2008 à 21:51:47  profilanswer
 

Oui c'est ca sauf que un id a pas forcement de corespondance dans la table mod_db et si il en a il en a pas forcement 10.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Probleme et optimisation de requete

 

Sujets relatifs
Probleme chargement de page et Javascript sous FirefoxProbleme avec Dreamweaver
Probleme WebspellProblème avec les frames dans Dreamweaver
Problème de listage d'une colonneProblème de tri sur une colonne
[SQL Server] Probleme Trigger et PhpProbleme de code
[PHP] Probleme de synthaxe ...[Oracle ASM] Problème d'optimisation de requête suite à migration
Plus de sujets relatifs à : Probleme et optimisation de requete


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