[mysql] requete

Eléphanteau du PHP | 12 Messages

30 déc. 2007, 11:30

Bonjours à tous, je me suis récement lancé dans la réalisation dans un jeu mais celui -ci demande pas mal de calcul ainsi je suis en train de revoir mes codes afin d'aléger mon server.

Je me suis rendu compte que dans de nombreux scripts je faisait une requetes SELECT pour obenir divers informations et que à chaques fois je vérfier cas par cas (les informmations) si les valeurs étaient égales à null et ensuite j'avisé en conséquence, un petit exemple :


$name = doquery('SELECT name1, name2, name3, name4, name5, name6, name7, name8, name9, name10, name11, name12, name13, name14, name15, zinc1, mercure1, oxonium1, zinc2, mercure2, oxonium2, zinc3, mercure3, oxonium3, zinc4, mercure4, oxonium4, zinc5, mercure5, oxonium5, zinc6, mercure6, oxonium6, zinc7, mercure7, oxonium7, zinc8, mercure8, oxonium8, zinc9, mercure9, oxonium9, zinc10, mercure10, oxonium10, zinc11, mercure11, oxonium11, zinc12, mercure12, oxonium12, zinc13, mercure13, oxonium13, zinc14, mercure14, oxonium14, zinc15, mercure15, oxonium15 FROM {{table}} WHERE galaxie=\''.$gal.'\' AND systeme=\''.$sys.'\'', 'g1', 2);

if ($name['name1'] != '')

	{

	$nbcolo++;

	$perso = doquery('SELECT id, alliance FROM {{table}} WHERE pseudo=\''.$name['name1'].'\'', 'joueurs', 3);

	$infos = doquery('SELECT nom FROM {{table}} WHERE id_joueur=\''.$perso[0].'\'', 'planetes', 3);

	$parse['nom_1'] = $infos[0];

	$parse['alliance_1'] = $perso[1];

	$parse['action_1'] = '<img src="'.IMAGES_DIR.'/espionner.gif" /> <img src="'.IMAGES_DIR.'/mp.gif" /> <img src="'.IMAGES_DIR.'/missiler.gif" />';

		if (!empty($name['zinc1']) OR !empty($name['mercure1']) OR !empty($name['oxonium1']))

		$parse['deb_1'] = '<img src="'.IMAGES_DIR.'/debris.gif" />';

	}
alors ma question serait y a-til un moyen de récupérer les donnés ou seulement la valeur vaut null ou inversement ?

Code : Tout sélectionner

CREATE TABLE IF NOT EXISTS `g1` ( `galaxie` int(11) NOT NULL, `systeme` int(11) NOT NULL, `zinc1` int(11) NOT NULL, `mercure1` int(11) NOT NULL, `oxonium1` int(11) NOT NULL, `zinc2` int(11) NOT NULL, `mercure2` int(11) NOT NULL, `oxonium2` int(11) NOT NULL, `zinc3` int(11) NOT NULL, `mercure3` int(11) NOT NULL, `oxonium3` int(11) NOT NULL, `zinc4` int(11) NOT NULL, `mercure4` int(11) NOT NULL, `oxonium4` int(11) NOT NULL, `zinc5` int(11) NOT NULL, `mercure5` int(11) NOT NULL, `oxonium5` int(11) NOT NULL, `zinc6` int(11) NOT NULL, `mercure6` int(11) NOT NULL, `oxonium6` int(11) NOT NULL, `zinc7` int(11) NOT NULL, `mercure7` int(11) NOT NULL, `oxonium7` int(11) NOT NULL, `zinc8` int(11) NOT NULL, `mercure8` int(11) NOT NULL, `oxonium8` int(11) NOT NULL, `zinc9` int(11) NOT NULL, `mercure9` int(11) NOT NULL, `oxonium9` int(11) NOT NULL, `zinc10` int(11) NOT NULL, `mercure10` int(11) NOT NULL, `oxonium10` int(11) NOT NULL, `zinc11` int(11) NOT NULL, `mercure11` int(11) NOT NULL, `oxonium11` int(11) NOT NULL, `zinc12` int(11) NOT NULL, `mercure12` int(11) NOT NULL, `oxonium12` int(11) NOT NULL, `zinc13` int(11) NOT NULL, `mercure13` int(11) NOT NULL, `oxonium13` int(11) NOT NULL, `zinc14` int(11) NOT NULL, `mercure14` int(11) NOT NULL, `oxonium14` int(11) NOT NULL, `zinc15` int(11) NOT NULL, `mercure15` int(11) NOT NULL, `oxonium15` int(11) NOT NULL, `name1` varchar(255) NOT NULL, `name2` varchar(255) NOT NULL, `name3` varchar(255) NOT NULL, `name4` varchar(255) NOT NULL, `name5` varchar(255) NOT NULL, `name6` varchar(255) NOT NULL, `name7` varchar(255) NOT NULL, `name8` varchar(255) NOT NULL, `name9` varchar(255) NOT NULL, `name10` varchar(255) NOT NULL, `name11` varchar(255) NOT NULL, `name12` varchar(255) NOT NULL, `name13` varchar(255) NOT NULL, `name14` varchar(255) NOT NULL, `name15` varchar(255) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Eléphant du PHP | 185 Messages

30 déc. 2007, 11:40

Oui, en ajoutant IS NULL ou IS NOT NULL à la suite de ta clause WHERE.

ViPHP
ViPHP | 5924 Messages

30 déc. 2007, 12:04

Pour compléter la réponse de Kaoteknik, je t'invite à consulter la doc mysql : http://dev.mysql.com/doc/refman/6.0/en/ ... or_is-null

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

31 déc. 2007, 00:40

Code : Tout sélectionner

SELECT name1, name2, name3, name4, name5...

Code : Tout sélectionner

mercure1, .. .mercure2, ... mercure3
:afraid: :non:

Je vois surtout un gros défaut de conception niveau BD.
Il te faut une table pour les "name1, etc." avec l'id correspondant à l'id de la table "g1".
Une table pour les matériaux avec l'id de la table "g1" et un champ déterminant le type "mercure, zinc etc."

Tu récupères le tout avec de belles jointures (join)

Profites du faite que tu te sois inscrit pour éditer ton message et utiliser un titre plus "parlant".

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 12 Messages

31 déc. 2007, 21:12

en fait oui il me semble que c'est pas bon ... si tu pouvais m'aider à mieux la constituer. En fait dans mon site j'ai une page galaxie où il y a 455 système solaires et où il y a 15 places par système solaire. En fait dés qu'un joueur colonise on lui attribue la place dans un système où il colonise et moi ce que j'ai fait c'est que j'ai crée la table g1 ci dessus en ayant en tête que name1 est le pseudo du joueur occupant la place 1 du système choisie de la galaxie, name2 le pseudo du joueur de la place 2 ... jusqu'à name15. Pareillement dnas chque place il peut y avoir des ressources (zinc, mercure, oxonium) ainsi zinc1, mercure1 et oxonium1 sont les ressources de la place 1 ...

Si tu pouvais m'aider à mieux constituer ma table stp

Sinon j'aurais une autre question, j'ai fait un essai de requête que je compte appliqué à beaucoup d'autres si elle convient (en fait je récupère un paquet d'information provenant de la table planète ayant pour id_joueur l'id du pseudo du joueur dans la table joueurs) :

Code : Tout sélectionner

$retour = mysql_query('SELECT UNIX_TIMESTAMP(p.timestamp), p.zinc, p.mercure, p.oxonium, p.uranium, p.mine_zinc, p.mine_mercure, p.mine_oxonium, p.mine_uranium, p.centrale_oxonium, p.depot_zinc, p.depot_mercure, p.depot_oxonium, p.depot_uranium, p.pourcentage_zinc, p.pourcentage_mercure, p.pourcentage_oxonium, p.pourcentage_uranium, p.centrale_condensation, p.station_solaire, p.tmin, p.tmax FROM planetes p join joueurs j on p.id_joueur=j.id WHERE j.pseudo=\''.$pseudo.'\'');
Merci à tous de m'aider et bonne fêtes !

ViPHP
ViPHP | 5924 Messages

01 janv. 2008, 01:10

Tiens ca me rappelle un autre jeu ça… :)

Eléphant du PHP | 185 Messages

01 janv. 2008, 03:28

Toute ressemblance avec un jeu dont le nom commence par "O" serait fortuite... :P

Eléphanteau du PHP | 12 Messages

01 janv. 2008, 10:21

^^ il ne ressemblera aucunement à oTRUC :p c'est juste du même genre.

VOus pouvez m'aider svp ?

ET bonne anné et bonne santé bien sur :)

Eléphant du PHP | 185 Messages

01 janv. 2008, 11:53

Je pense que tu devrais commencer par scinder ta table en trois tables distinctes :

- Une table "joueurs" contenant l'id et le pseudo de chacun d'entre-eux.
- Une table "systemes" contenant un id, le nom du système et l'id du joueur.
- Une table "planetes" contenant un id, le nom de la planète, l'id du système et autant de champs supplémentaires qu'il y a de ressources différentes.

Pour la dernière table il suffirait d'indiquer dans les champs des différentes ressources une valeur 0 (NULL si la ressource n'est pas disponible sur cette planète) ou 1 (NOT NULL si la ressource est présente sur cette planète).

Ensuite pour extraire de la base de données les infos nécessaires il faudra passer par des jointures.

Si par exemple tu veux obtenir la liste des joueurs et des planètes qu'ils ont en leur possession, la requête pourrait être comme ceci :

Code : Tout sélectionner

$req = "SELECT joueurs.pseudo, systemes.nom, planetes.nom ". "FROM joueurs, systeme, planetes ". "WHERE systemes.id_joueur = joueurs.id AND planetes.id_systeme = systeme.id";
A tester evidemment, mais commence déjà par séparer tes tables... :)

ViPHP
ViPHP | 5924 Messages

01 janv. 2008, 13:11

Je ne crois pas que les systèmes aient des noms, et ils ne sont pas reliés à un joueur précis.

Personnellement j'aurais vu un truc plutôt du genre :

-table joueur (id, nom, login, …)
-table planète (id, id_joueur, nom, galaxie, système, position, zinc, mercure, oxonium, uranium)
Les pourcentages ne peuvent pas se recalculer à chaque fois qu'ils sont utilisés ? Niveau temps de calcul ça donnerait quoi ?
Sinon j'ai du mal à comprendre à quoi peut être utile du mercure :D
-table infrastructure (id_planete, type (entier), niveau)
On met tous les batiments et autres infrastructures dans une table à part histoire d'éviter de multiplier les champs dans la table planète…
Et tu fais pareil si par exemple tu mets des vaisseaux ou des recherches ou tout autre chose.

Eléphanteau du PHP | 12 Messages

01 janv. 2008, 14:20

^^ j'ai justement multiplier les champs dans la table planète mais je vais surement suivre ton conseil.
Mais pour la table galaxie je fait comment alors ? Sinon pour les pourcentages de production tu parlais ?

ViPHP
ViPHP | 5924 Messages

01 janv. 2008, 14:32

Mais pour la table galaxie je fait comment alors ?
Bah les informations sont du coup dans la table planete
Sinon pour les pourcentages de production tu parlais ?
Je disais que il faut voir en fonction du temps de calcul que ca prend si c'est utile de stocker cette information ou non…

Eléphanteau du PHP | 12 Messages

01 janv. 2008, 15:25

A ben oui ^^

Sinon ben pour le temps de calcul comment puis-je faire pour le savoir ?

ViPHP
ViPHP | 5924 Messages

01 janv. 2008, 16:37

Tu utilises la fonction microtime() de php pour avoir le temps en microsecondes.
Et tu fais la différence pour avoir le temps qu'a pris l'opération (Regarde la doc de microtime() pour avoir plus d'infos à ce sujet).

Eléphanteau du PHP | 12 Messages

01 janv. 2008, 17:11

oki je vais coder tout à l'heure un module ou seul moi (connecté) je verrai le temps de chargement de chaque page et le nombre de requêtes exécutés.

sinon j'aurais deux autres 'tite question :
-ESt ce que cette requête est bien conçue ?

Code : Tout sélectionner

$retour = mysql_query('SELECT UNIX_TIMESTAMP(p.timestamp), p.zinc, p.mercure, p.oxonium, p.uranium, p.mine_zinc, p.mine_mercure, p.mine_oxonium, p.mine_uranium, p.centrale_oxonium, p.depot_zinc, p.depot_mercure, p.depot_oxonium, p.depot_uranium, p.pourcentage_zinc, p.pourcentage_mercure, p.pourcentage_oxonium, p.pourcentage_uranium, p.centrale_condensation, p.station_solaire, p.tmin, p.tmax FROM planetes p join joueurs j on p.id_joueur=j.id WHERE j.pseudo=\''.$pseudo.'\'');
-Si elle est bien conçu j'ai essayé toute à l'heure de récupérer des infos de la table joueurs en rajoutants les champs j.pseudo, j.conduction dans la sélection des champs juste avant le FROM mais il ne me les sélectionne pas :S

Merci de vos réponses au fait :D Sa m'aide vraiment pas mal