IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 MySQL Discussion :

Je n'arrive pas à faire des requêtes imbriquées


Sujet :

MySQL

  1. #1
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    496
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 496
    Points : 123
    Points
    123
    Par défaut Je n'arrive pas à faire des requêtes imbriquées
    Bonjour

    j'ai une table "classement_donne" ci dessous qui enregistre les resultats et calcul le classement d'une donne (d'un jeu de bridge).
    Je sais, ne criais pas, j'ai déjà entendu qu'il ne fallait pas mettre de calcul dans une table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    1	idPrimaire	int(11) AUTO_INCREMENT
    2	id_donnes 	int(11) Index	// donne le numéro de la donne
    3	resultat	int(11)               // résultat d'un nombre "NMemescore" de joueur de la donne "id_donnes"
    4	NscoreSup	int(11)               // nombre de joueur qui ont un résultat supérieur à "resultat"
    5	NMemescore int(11)             // nombre de joueur qui ont le même "resultat"
    6	classement	float                  // classement en pourcentage du "resultat" pour la donne "id_donne"
    pour mettre à jour une partie de la table avec le résultat à chaque fois qu'un joueur a terminé une donne
    je dois mettre à jour NScore plus pour toutes les lignes dont "resultat" est inférieur au résultat du joueur.
    j'ai écris ce code ci-dessous mais il me semble pas très correct je n'arrive pas à faire des requête imbriquée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	//incremente NScoreSup pour les lignes inférieures à resutat
    	$sql="SELECT NScoreSup, resultat FROM classement_donne WHERE id_donnes =".$id_donnes." AND resultat <".$resultat;	
    	$rep=$connexion->query($sql);
    	while ($donnees = $rep->fetch()){
    		$NScoreSup=$donnees['NScoreSup']+1;//incremente NScoreSup pour chaque ligne inférieure à resutat
    		$resultatInf=$donnees['resultat'];//récupére le resutatInf de chaque ligne inférieure à resutat
    		echo ' NScoreSup : '.$NScoreSup.'  pour le resultat inférieur '.$resultatInf. '<br />';		
    		//update le NScoreSup de chaque ligne inférieure à resultat 
    		$sql2="UPDATE classement_donne SET  NScoreSup=(".$NScoreSup.")  WHERE id_donnes=".$id_donnes." AND resultat=".$resultatInf;
    		$connexion->query($sql2);
    	}
    	 $rep->closeCursor(); // Termine le traitement de la requête
    Après ces corrections éventuels je vous demanderai comment je dois faire pour que ce calcul ne soit pas dans une table.
    à chaque nouveau résultat d'un joueur pour une donne ça va modifier le classement de cette donne et normalement j'afficherai le classement dans une page HTML . Mais n'importe qui peut venir demander à consulter le classement actualisé. Et en fin de journée le tournoi est terminé et ce classement dernier actualisé doit être gardé en mémoire sur disque dur pour qu'on puisse n'importe quel jour pouvoir le consulter.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 783
    Points
    30 783
    Par défaut
    Ton explication ne semble pas très claire et bon nombre de développeurs SQL ne parle pas php et ne peut donc déduire de ton code les opréations que tu effectues.
    Pourrais-tu donner un exemple avec le contenu de la table avant et après calcul ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    496
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 496
    Points : 123
    Points
    123
    Par défaut
    1) il me semble que ceux sont des requêtes Mysql dans une une page PHP

    2) deux modifications de ma table:
    a) j’insère une nouvelle ligne avec un nouveau résultat (que j'aurais du appeler score) .
    ce nouveau résultat augmente le nombre de score (le nombre de player) et pour toutes les lignes de résultats inférieurs incrémente de 1 le nombre de score supérieur au résultat de chaque ligne.
    b) un joueur a un résultat qui existe déjà dans la table ceci va avoir pour conséquence d’incrémenter le nombre de même score pour ce résultat et comme précédemment de devoir incrémenter le nombre de score supérieur pour toutes les lignes inférieures.

    Ces deux modifications obligent à recalculer le classement de chaque ligne

    premier classement l'id 5144 a pour résultat 43
    Nom : classement.JPG
Affichages : 111
Taille : 30,9 Ko
    un nouveau joueur a eu ce résultat 43 pour cette donne 16 , j'ai donc updaté sa ligne et par conséquent les "NScoresup" de toutes les lignes inférieures ainsi que le classement de chaque ligne (ne faites pas attention au classement , je vois que phpmyadmin a fait une fois un arrondi, mais ma formule est bonne et toutes les lignes sont à jour)
    d'ailleur c'est une opération qui est assez longue de quelques secondes pour mettre à jour environ 8000 lignes concernées mais qui devraient se trouver dans une base de 200 000 lignes peut être
    Nom : classement2.JPG
Affichages : 113
Taille : 35,2 Ko

    j'espère que c'est plus clair, après c'est peut être pas la bonne méthode mais .....

  4. #4
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Salut,

    Je pense qu'il y a, au départ, une erreur d'analyse dans la structuration des données. Tu ne devrais pas avoir à faire ces opérations à chaque insertion. En faisant cela tu déstructures et tu impliques une odification en cascade.

    Si vraiment tu ne peux faire autrement, ce type de modifications, directement liées aux données, devraient être traitées par un (ou plusieurs) trigger. Cela permet de garantir la cohérence des données (c'est la base qui reste la propriétaire de la données et de sa cohérence), cela va aussi permettre un traitement plus rapide qu'en passant par des échanges entre ton serveur PHP et ton serveur SQL. D'autant que pour un jeu de données de l'ordre de 200.000 cela peut commencer à faire pas mal de modifications en cascades.

    A ta place je réfléchirais à un modèle de données qui permettrait de ne pas avoir à faire ces opérations sur les données déjà saisie. Parts du principe que le résultat d'une donne pour un joueur est une donnée qui doit être traité dans un enregistrement d'une table. Le reste est soit dans d'autres tables, soit un calcul à la restitution des données. Le principe d'une base SQL est de stocker des données, pas de procéder à des calculs mode tableur.

    Tu peux peut-être tenter d'expliquer ce que tu veux, mais sans essayer de dire comment tu penses y arriver, juste le besoin brute.

    Bonne chance.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  5. #5
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    496
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 496
    Points : 123
    Points
    123
    Par défaut
    Bonjour

    merci pour cette réponse.

    En fait pour ce qui est des requêtes imbriquées j'ai un peu avancé et réussi à faire ce que je voulais assez long mais je tatonne pour améliorer.

    Ce qui m'intéresse ce sont tes questions .
    Tu ne devrais pas avoir à faire ces opérations à chaque insertion. En faisant cela tu déstructures et tu impliques une odification en cascade.
    A chaque fois qu'un joueur fini une donne il a un certain score que je dois mémoriser dans cette donne_playeur.
    Ensuite je suis obligé, pour avoir son classement, de trouver combien de player ont un score supérieur au sien et aussi combien de player ont un score identique au sien pour cette donne.
    Ceci j'ai réussi à le faire. Soit avec une requête utilisant des sous requêtes ou Soit avec des jointures (ce qui fait parti d'un nouveau post) mais là bizarrement les jointures sont 10 fois plus longues.
    le résultat d'une donne pour un joueur est une donnée qui doit être traité dans un enregistrement d'une table
    C'est ce que je fait à chaque nouveau score d'un joueur d'une donne terminée est enregistré.
    soit un calcul à la restitution des données.
    c'est cez que je cherche pour le calcul du classement, mais d'obtenir le nombre de score supérieur ou de score identique, je pense du travail de la base de donnée.
    Tu peux peut-être tenter d'expliquer ce que tu veux, mais sans essayer de dire comment tu penses y arriver, juste le besoin brute.
    C'est ce que je pensais avoir fait.
    Mais je pense que tu peux m'aider sur la conception de la base.
    Je veux gérer dans une base de donnée des tournois de bridge sur internet, d'abord le classement et ensuite les parties par elles même.
    Mais commençons par le classement:
    Chaque joueur joue avec un robot contre 2 autres robots. A la fin d'une donne c'est lui qui a un score en fonction du résultat.
    Tous les jours est organisé un tournoi de bridge constitué de 16 donnes. Chaque joueur (en moyenne 1000 joueurs par jour) qui a terminé une donne est classé pour cette donne et en même temps est comptabilisé dans le classement du tournoi des 16 donnes.
    Voici comment j'ai structuré ma base:
    la table "players" avec son id, pseudo
    la table "tournois" id (auto-oncrémente) , date_jour
    la table "donnes" avec id (auto-incremente), id_tournois (référence au tournoi du jour)
    la table "donnes_players" avec id (auto-incremente), id_players (quel joueur joue cette donne), id_donnes(donne jouée par le player), score (résultat du player pour cette donne).

    Ce que je me demandais c'est si je devais conservée la structure présentée ci-dessus qui va enfler rapidement pour donnes_players 16*1000 lignes supplémentaires par jour, surtout qu'après ces lignes ne serviront plus que d'archives.
    Ou si je devais créer une table par jour de tournoi?

Discussions similaires

  1. une requête que je n'arrive pas à faire marcher
    Par JeanNoel53 dans le forum Firebird
    Réponses: 8
    Dernier message: 16/12/2013, 09h27
  2. Je n'arrive pas à faire cette requête
    Par sadkat dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/07/2011, 09h15
  3. [AC-2007] Je n'arrive pas à faire des modif sur mon formulaire
    Par solaar dans le forum IHM
    Réponses: 6
    Dernier message: 18/07/2011, 21h14
  4. Une requête que je n'arrive pas à faire
    Par Denti-fritz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/12/2005, 13h53
  5. [Requête] Faire une requête imbriquée?
    Par sekiryou dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2004, 22h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo