Optimisation : Un select et un autre select en fonction de la réponse du premie

Filipe35
Messages postés
470
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
23 octobre 2007
- 28 sept. 2006 à 23:19
Filipe35
Messages postés
470
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
23 octobre 2007
- 2 oct. 2006 à 17:52
Bonjour à tous

Je me heurte à un problème mineur d'optimisation de mes requètes :P

voici ma table:

nom | nb_lv | lv1 | lv2 | lv3 | lv4 | lv5 | lv6 |

Imaginons le cas suivant:
nom = Bob
nb_lv = 3
lv1 = 153segb
lv2 = 158gfag
lv3 = gfz51ge
lv4,5,6 = ''

actuellement je récupère à l'aide d'un select,nb_lv
ensuite je crée une requete en fonction de nb_lv  que
je transmet à un select

ce qui me fait 2 requetes select pour une opération banale....

N'y a-t-il pas un moyen à l'aide de LIMIT et d'une autre fonction
de selectionner directement lv1,lv2,lv3 (soit les lvX remplis) et donc
de réduire le nombre de requetes à 1 ?

Merci de vos réponses

++
Filipe





__________________________________________________
http://www.OgameTut.Free.Fr - Le site sur ogame de référence !
http://Signz.free.fr - Le générateur de signatures 100% Gratuit

8 réponses

nhervagault
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
35
30 sept. 2006 à 12:11
Salut

Peux-tu parler plus precisment?
Moi, avoir pas toutr compris. ;-)


Je pense que ta table est mal faite tout simplement.

Si je comprends (a travers une boule de cristal)
Tu veux recuperé la valeur du champs
lvl 3 si nblvl = 3

Je ne comprends pas trop l'interets de deux requetes.
ecris ta premiere et ta deuxieme requete


Précise ton post.
Car c'est trop vague

lvi 4 si nblvl = 4
0
Filipe35
Messages postés
470
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
23 octobre 2007
1
30 sept. 2006 à 12:25
Salut

effectivement après m'être relus, c'est très vague ce que j'ai écrit :S

Toujours le même exemple mais plus précis cette fois ^^

La table:


nom | nb_lv | lv1 | lv2 | lv3 | lv4 | lv5 | lv6 |

les valeurs:

nom = Bob
nb_lv = 3
lv1 = 153segb
lv2 = 158gfag
lv3 = gfz51ge
lv4=''

lv5=''

lv6=''




a. 1ère requête SELECT  récupère nb_lv
b. Ensuite je crée une requête qui va récupérer les nb_lv
premiers
levels
(dans notres cas les 3 premiers lv ( lv1, lv2 et lv3 ) vu que

nb_lv = 3 )




SELECT lv1 lv2 lv3

=> 2 requêtes pour une opération assez simple :S

voila j'espère que mon problème parait plus clair maintenant ;)

++

Filipe




__________________________________________________
http://www.OgameTut.Free.Fr - Le site sur ogame de référence !
http://Signz.free.fr - Le générateur de signatures 100% Gratuit !
0
nhervagault
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
35
30 sept. 2006 à 14:19
Re :

Je comprends toujours pas.

Select * from matable where nom= 'bob'

Ensuite c'est au programme de géré

while ( i <nb )
lire colonne (lv+"i")

end while

Explique ce que tu veux en resultat pas en sql en francais

Peut etre que je comprendrais mieux
0
Filipe35
Messages postés
470
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
23 octobre 2007
1
30 sept. 2006 à 17:51
Oui tu as répondu en partie à ma question, mais je souhaite quand même éviter au maximum les SELECT * (car dans ma vraie base je n'ai pas 6 lv mais beaucoup plus) ce qui ferrai une grande réponse de la part du server SQL et donc une réponse plus lente car plus de données à transmettre.

__________________________________________________
http://www.OgameTut.Free.Fr - Le site sur ogame de référence !
http://Signz.free.fr - Le gén&#
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nhervagault
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
35
30 sept. 2006 à 18:28
Salut

C'est bien ce que j'ai dis au depart c'est que ta base
est mal faite.

Et tu aurais pu mettre que tu ne voulais pas utiliser de select * pour eviter de me creuser la tete a comprendre la question.

Alors tu veux

Que si tu nb = 3 3 champs ..
si nb 4 4 champs.

C'est un peu tordu.

La solution la plus propre est de refaire ta table

joueur
id nom niveau

score
niveau score id_joueur

et

faire une requete
du style

select joueur.*, score.* from joueur
inner join score on joueur.id = score.id_joueur


--> un resultat

joueur nb level score
A 3 1 3
A 3 2 10
A 3 3 45

Donc dans ton prog il te reste qu'a lire les difrent
enregistrement et à la mettre dans un tableau

voila
0
Filipe35
Messages postés
470
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
23 octobre 2007
1
1 oct. 2006 à 01:09
Je ne vois pas ce qu'il y a de tordu oO

J'interroge ma base pour savoir combien de variables je dois récupérer à l'aide d'une autre requête. (une certaines logique en somme)

Mais avec la lecture de tes réponses, et autres textes que j'ai lus par la suite, il semblerait que MySql ne pense pas pareil ^^

J'ai vu aussi que les SELECT * étaient déconseillés oO

Sinon peux-tu être plus précis sur la manière de recréer mes tables ?

Merci de tes réponses et d'accorder de ton temps à mon problème.
0
nhervagault
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
35
1 oct. 2006 à 14:25
Salut

Pour info un select * n'est pas recommandé.
Mais souvent c'est plus interressant que de faire deux resuter

EN plus le select * est a proscrire surtout dans le cas des
des champs de type texte.

Fais un select champ1,champ2,champ3
A la place

Mais pour info un select count(*) est plus optimisé
que un select count(A)



Les bonnes pratiques ne sont pas a suivre a la lettre
et de toute maniere, tu utilises une requete optimisé
et ton programme n'est pas optimisé.
C'est un peu du gachis, il faut un tout.

Et il faut savoir ou optimisé.
Il faut optimisé, les 20% du programme
ou 80% du temps est passé.

Pour ta structure
de table

Je te propose 2 tables
detail de la table score
=======================
niveau score id_joueur
1 34 A
2 56 A
3 123 A
1 45 B

Voila
0
Filipe35
Messages postés
470
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
23 octobre 2007
1
2 oct. 2006 à 17:52
Merci bien, je vais essayer d'appliquer tout ça ;)

__________________________________________________
http://www.OgameTut.Free.Fr - Le site sur ogame de référence !
http://Signz.free.fr - Le gén&#
0