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

Requêtes MySQL Discussion :

Jointure avec une table qui a deux colonnes comme clef primaire


Sujet :

Requêtes 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 Jointure avec une table qui a deux colonnes comme clef primaire
    Bonjour

    j'ai 2 tables : "donnes_players" avec id
    id_donne clef étrangère de la table "donnes"
    id_player clef étrangère de la table "players"
    score le score d'un player à la fin d'une donne

    pour une même "id_donne" sur 500 "id_player" il y a de nombreux "score" identiques
    j'ai donc créer une autre table qui donne un "classement" pour chaque "score" d'une "id_donne"
    table "classement_donnes" avec id
    id_donne ) j'ai fait une clef primaire
    score ) sur ces deux colonnes
    classement

    comment faire un SELECT sur classement en ayant id_donne et id_player

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT classement FROM classement_donnes AS clD2
    			   INNER JOIN donnes_players AS dp2
    			   ON  ?????

  2. #2
    Membre averti
    Homme Profil pro
    Autres
    Inscrit en
    Mai 2017
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Autres

    Informations forums :
    Inscription : Mai 2017
    Messages : 279
    Points : 421
    Points
    421
    Par défaut La table classement n'est pas nécessaire.
    Le classement est un affichage en effectuant un SELECT sur ta table dones_players.
    Pour ma part, j'ajouterais une colonne de type date DATETIME ou TIMESTAMP dans la table donnes_players qui contiendra la date et l'heure.
    Afin de faire le classement, il suffirait d'exécuter la requête suivante (contenant un max f'info à toi de choisir ce que tu veux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT MAX(dp.score), p.identifiantplayers, p.nomplayers, d.identifiantdonnes, d.designationdonnes, dp.dateheure  FROM donnes_players AS dp
                   INNER JOIN (Players AS p, donnes AS d)
                   ON  (dp.identifiantplayers = p.identifiantplayers AND dp.identifiantdonnes = d.identifiantdonnes)
     
     ORDER BY (dp.dateheure) DESC;
    L’appétit vient en mangeant.
    Pourquoi compliquer quand on peut faire plus simple?
    Une réponse vous a été utile? pensez à
    Vous avez eu la réponse à votre question? marquez votre discussion
    Faites un tour aux FAQs et aux tutoriels et cours.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Je confirme, pas besoin de 3ème table

    @marco62118 : pouvez vous communiquer un exemple de résultat attendu, car ce n'est pas clair pour moi

    @Nazoïde : la syntaxe de votre requête est invalide au niveau des jointures et du groupage

  4. #4
    Membre averti
    Homme Profil pro
    Autres
    Inscrit en
    Mai 2017
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Autres

    Informations forums :
    Inscription : Mai 2017
    Messages : 279
    Points : 421
    Points
    421
    Par défaut
    @marco62118 peux-tu envoyer les scripts SQL de création des tables concernées avec des données pour test et exprimer clairement ce que tu veux?
    L’appétit vient en mangeant.
    Pourquoi compliquer quand on peut faire plus simple?
    Une réponse vous a été utile? pensez à
    Vous avez eu la réponse à votre question? marquez votre discussion
    Faites un tour aux FAQs et aux tutoriels et cours.

  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
    Merci pour votre intérêt

    1)je ne savais pas qu'on pouvais faire une jointure sur 2 tables à la fois? cette formulation est elle valide ?
    FROM donnes_players AS dp
    INNER JOIN (Players AS p, donnes AS d)
    2)je ne sais pas comment envoyer un exemple des tables!
    je vais tenter d'être clair

    dans la table donnes_players il y a toutes les donnes (16 par jour) de tous les joueurs (environ 500 par tournois) ce qui donne 8000 couples couples de (donne1 et player1 et son score de fin de partie, donne1 et player2 et son score de fin de partie,....,donne16 et player500 et son score de fin de partie).
    donc pour chaque donne il faut faire le classement en pourcentage. Ce pourcentage est basé sur le nombre de score identique (ex 5 players ont eu 400 de score, 15 ont eu 150 de score....) il faut aussi le nombre de score supérieur au score du player (ex il y a 300 players qui ont un score supérieur au score de 400 du playeur pour qui on veut le classement).
    c'est pour ça que j'ai recréé une table avec les scores regroupés. Comme cela à chaque fin de partie d'un joueur son nombre de score identique est incrémenté de 1 (ex 5+1 players de score 400) mais aussi il faut incrémenter tous les scores supérieur pour les catégories de score qui sont inférieur dans l'ex à 400 .

    est ce clair

    3) en fait j'ai fini par trouver ce que je voulais il suffit de faire comme l'indique @Nazoide une double condition sur le ON
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FROM donnes_players AS dp	
    INNER JOIN classement_donnes AS cl
    ON dp.id_donnes=cl.id AND dp.score=cl.score
    4) je clique sur résolu pour mon problème mais je suis preneur d'une réponse au 1) et suis ouvert à toutes solution pour établir mon classement

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Avec un SGBD plus riche que MySQL, une fonction de fenêtrage RANK ou DENSE_RANK vous aurait facilité la vie
    Pour obtenir le même résultat avec MySQL, c'est bigrement plus compliqué et je n'ai pas de base MySQL sous la main pour prototyper la requete

  7. #7
    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
    pas grave , je vous remercie

    j'y arrive petit à petit en tâtonnant avec les jointures .

    avec l'ensemble des requête cidessous ça fonctionne bien mais je voulais faire plus mieux bien avec une seule requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    //mise à jour des score supérieur et du classement dans classement donne
    $sql="SELECT DISTINCT id_donnes FROM classement_donnes";
    	$rep=$connexion->query($sql);
    	while ($donnees = $rep->fetch()){
    		echo 'id_donnes : '.$donnees['id_donnes']. '<br />';
    		$sql1="SELECT nbrePlayer FROM donnes WHERE id=".$donnees['id_donnes'];
    		$rep1=$connexion->query($sql1)->fetch();
    		echo 'nbrePlayer : '.$rep1['nbrePlayer']. '<br />';
    		$sql2="SELECT score FROM classement_donnes WHERE id_donnes = ".$donnees['id_donnes'];
    			$rep2=$connexion->query($sql2);
    			while ($donnees2 = $rep2->fetch()){
    				echo 'score : '.$donnees2['score']. '<br />';
    				$sql3="SELECT COUNT(score)AS NBscoreSup FROM donnes_players WHERE  score>".$donnees2['score']." AND id_donnes=".$donnees['id_donnes'];
    					$rep3=$connexion->query($sql3);
    					while ($donnees3 = $rep3->fetch()){
    						echo 'NBscoreSup : '.$donnees3['NBscoreSup']. '<br />';
    						$sql4="UPDATE classement_donnes SET NscoreSup =".$donnees3['NBscoreSup'].",
    								classement=((100*((".$rep1['nbrePlayer']."-1)-".$donnees3['NBscoreSup']."-(0.5*(NMemeScore -1))))/(".$rep1['nbrePlayer']."-1)) 
    						WHERE  score=".$donnees2['score']." AND id_donnes=".$donnees['id_donnes'];
    						$connexion->query($sql4);					
    					}
    			}
    	}
    ceci permettant de mettre à jour la table classement_donne par rapport à la table donne_player d'un seul coup mais normalement il y a une fonction qui met à jour ligne par ligne lorsqu'une partie est finie. Mais j'aurais besoin pour mettre à jour des vielles tables.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/09/2014, 16h04
  2. jointure avec une table dans une autre DB
    Par bastringue dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/05/2008, 15h34
  3. Réponses: 1
    Dernier message: 18/07/2007, 11h58
  4. comment relier une table qui a deux maîtres
    Par tchimou dans le forum Bases de données
    Réponses: 7
    Dernier message: 07/05/2007, 20h15
  5. Réponses: 1
    Dernier message: 18/01/2006, 17h51

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