Page 1 sur 2

[mysql] requete

Posté : 30 déc. 2007, 11:30
par guetguet
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;

Posté : 30 déc. 2007, 11:40
par Kaoteknik
Oui, en ajoutant IS NULL ou IS NOT NULL à la suite de ta clause WHERE.

Posté : 30 déc. 2007, 12:04
par Sékiltoyai
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

Posté : 31 déc. 2007, 00:40
par Truc

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".

Posté : 31 déc. 2007, 21:12
par guetguet
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 !

Posté : 01 janv. 2008, 01:10
par Sékiltoyai
Tiens ca me rappelle un autre jeu ça… :)

Posté : 01 janv. 2008, 03:28
par Kaoteknik
Toute ressemblance avec un jeu dont le nom commence par "O" serait fortuite... :P

Posté : 01 janv. 2008, 10:21
par guetguet
^^ 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 :)

Posté : 01 janv. 2008, 11:53
par Kaoteknik
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... :)

Posté : 01 janv. 2008, 13:11
par Sékiltoyai
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.

Posté : 01 janv. 2008, 14:20
par guetguet
^^ 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 ?

Posté : 01 janv. 2008, 14:32
par Sékiltoyai
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…

Posté : 01 janv. 2008, 15:25
par guetguet
A ben oui ^^

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

Posté : 01 janv. 2008, 16:37
par Sékiltoyai
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).

Posté : 01 janv. 2008, 17:11
par guetguet
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