Probleme et optimisation de requete

Probleme et optimisation de requete - SQL/NoSQL - Programmation

Marsh Posté le 07-02-2008 à 20:08:33    

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
Reply

Marsh Posté le 07-02-2008 à 20:08:33   

Reply

Marsh Posté le 07-02-2008 à 20:38:30    

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
Reply

Marsh Posté le 07-02-2008 à 22:16:49    

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 ?

Reply

Marsh Posté le 07-02-2008 à 22:28:56    

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
Reply

Marsh Posté le 07-02-2008 à 22:37:41    

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
Reply

Marsh Posté le 09-02-2008 à 11:54:01    

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.

Reply

Marsh Posté le 10-02-2008 à 17:39:00    

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
Reply

Marsh Posté le 10-02-2008 à 20:07:01    

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 :/

Reply

Marsh Posté le 10-02-2008 à 20:27:12    

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

Reply

Marsh Posté le 10-02-2008 à 20:52:35    

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.

Reply

Marsh Posté le 10-02-2008 à 20:52:35   

Reply

Marsh Posté le 11-02-2008 à 13:37:44    

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
Reply

Marsh Posté le 11-02-2008 à 21:51:47    

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.

Reply

Sujets relatifs:

Leave a Replay

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