[Résolu] SQL liste meilleur score pour 1 joueur

SQL liste meilleur score pour 1 joueur [Résolu] - SQL/NoSQL - Programmation

Marsh Posté le 08-07-2008 à 10:18:14    

Bonjour à tous,
 
Voilà j'ai un petit problème sur une requete SQL que je n'arrive pas à faire.
En fait je souhaite faire un programme qui permette d'exporter les scores du jeu "Ultrastar" (clone gratuit de singstar) vers une page web.
 
Mon idée serait qu'après avoir joué, on lance le programme qui irait chercher les scores dans le fichier ultrastar.db. (base au format sqllite) et qui remplirait une base mysql placé sur un compte chez free. Ceci afin de pouvoir faire un tableau de scores commun avec nos amis.
 
La base est composée de 2 tables :
US_Scores
-> SongID
-> difficulty
-> Player
-> Score
 
US_Songs
-> ID
-> Artiste
-> Title
-> Play (je crois mais ce champs, je m'en fout en fait : il comptabilise le nombre de fois qu'une chanson a été jouée).
 
Ce que je voudrais c'est extraire de la base la liste des meilleurs scores par chanson et par joueur, pour obtenir une seule ligne, par exemple :
artiste,    titre,                 difficulty, player,   score
Nirvana,   Rape me,            0,          toto,     5000
Nirvana,   Rape me,            0,          titi,       4500
Queen,    Show must go on  0,          toto,     3000
Etc....
 
Donc le meilleur score pour chaque joueur, sur chaque chanson et pour chaque difficulté.
 
J'ai essayé :
SELECT artiste, title, difficulty, player, score FROM us_songs, us_scores w WHERE us_songs.id=us_scores.songid GROUP BY player, score
 
Mais en fait ça me donne la liste complète (j'ai tous les scores pour un joueur sur une même chanson pour une même difficulté : or il me faut uniquement son meilleur score). Je pense qu'il faut faire une requête imbriquée, mais je n'arrive pas à la construire.
 
Quelqu'un a-t-il une idée, je pense que ce ne doit pas être très dur, mais je sèches (mes cours d'SQL sont beaucoup trop anciens).
 
(je précise qu'il s'agit du 'mod' ultrastar deluxe : dans la version normale les scores ne sont pas stockés dans une base de donnée).
 
Merci de votre aide :) par avance.


Message édité par totof74 le 08-07-2008 à 15:51:01
Reply

Marsh Posté le 08-07-2008 à 10:18:14   

Reply

Marsh Posté le 08-07-2008 à 10:37:54    

SELECT player, artiste, title, difficulty,  max(score) FROM us_songs, us_scores w WHERE us_songs.id=us_scores.songid GROUP BY player, artiste, title, difficulty


---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 08-07-2008 à 10:50:35    

Salut et merci beaucoup de ta réponse :)
Je viens d'essayer en me créant une bdd access pour tester, et ça ne marche pas (ça vient peut-être d'access ?). En fait il me demande la valeur de l'expression us_scores.songid avant de lancer la requête... Et si je lui en donne une, il me sort bien l' artiste/titre/player, mais le score ne correspond pas : il me prend le meilleur score pour le joueur sur toute les chansons.
 
Dans mon exemple ci-dessus, ça donnerais un truc du style :
Queen,    Show must go on  0,          toto,     5000 (alors que ça devrait être 3000)
Queen,    Show must go on  0,          titi,       4500 (alors que titi dans mon exemple, n'as pas de score pour cette chanson).
 
En fait, en gros, il prend le meilleur score pour un joueur et il l'applique à la chanson qu'on lui a donné...
???


Message édité par totof74 le 08-07-2008 à 10:55:14
Reply

Marsh Posté le 08-07-2008 à 12:19:13    

j'avais même pas vu la syntaxe dégueu pour ta jointure :o
 
SELECT player, artiste, title, difficulty,  max(score) FROM us_songs join us_scores on us_songs.id=us_scores.songid GROUP BY player, artiste, title, difficulty


---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 08-07-2008 à 13:41:30    

anapajari a écrit :

j'avais même pas vu la syntaxe dégueu pour ta jointure :o


 
=> pô compris  :heink:  
 
Sinon, j'ai essayé ta requête, ça me donne : erreur de syntaxe dans la clause FROM, j'ai ajouté la table us_scores, mais pareil...
 
Finalement, je pense que j'ai trouvé, en faisant ça :
 
SELECT us_scores.difficulty, us_scores.player, Max(us_scores.score) AS MaxDescore, us_songs.id, us_songs.artiste, us_songs.title
FROM us_scores, us_songs
GROUP BY us_scores.songid, us_scores.difficulty, us_scores.player, us_songs.id, us_songs.artiste, us_songs.title
HAVING us_songs.id=us_scores!songid;
 
C'est sans doute pas très propre, vu que ça sort du requêteur d'access, mais ça à l'air de marcher.
Qu'en penses tu ? on peut simplifier ?
 
thanks :jap:

Message cité 1 fois
Message édité par totof74 le 08-07-2008 à 13:42:35
Reply

Marsh Posté le 08-07-2008 à 13:57:33    

totof74 a écrit :


 
=> pô compris  :heink:


les jointures se font avec (INNER|LEFT|RIGHT) JOIN, pas avec une clause WHERE


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 08-07-2008 à 14:12:13    

Harkonnen a écrit :


les jointures se font avec (INNER|LEFT|RIGHT) JOIN, pas avec une clause WHERE


 
=> OK  merci :jap:  
Hé ben vous êtes contents là, y'en a plus de "WHERE"  :whistle:  
 
Le HAVING ça vous va ? ou "c pô bô"


Message édité par totof74 le 08-07-2008 à 14:12:59
Reply

Marsh Posté le 08-07-2008 à 14:35:04    

c pas bo et ça fait surtout pas ce que tu veux.
Sans la description des tables c'est dur de t'aider pour écrire la jointure


---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 08-07-2008 à 14:41:53    

anapajari a écrit :

c pas bo et ça fait surtout pas ce que tu veux.
Sans la description des tables c'est dur de t'aider pour écrire la jointure


 
Heu ben si justement... enfin j'ai fait un jeu de test sur 10 enregistrements ça à l'air de marcher (sous access, il tolère peut-être les conneries  :??: )
C pas bo => ça c'est fort possible  :whistle:  
 
Pour la description des tables, ce qu'il y avait dans mon premier topic ne convient pas ? Dis moi ce que tu as besoin d'autre. Merci de ton aide

Reply

Marsh Posté le 08-07-2008 à 15:27:27    

Si mais j'avais pas lu :o
Et d'ailleurs ma requête devrait marcher du coup, comprends po mais en même temps je maitrise pas access ...
essaye en forçant le inner join:

Code :
  1. SELECT
  2.  player,
  3.  artiste,
  4.  title,
  5.  difficulty,
  6.  max(score)
  7. FROM
  8.           us_songs
  9. INNER JOIN us_scores ON us_songs.id=us_scores.songid
  10. GROUP BY
  11.  player,
  12.  artiste,
  13.  title,
  14.  difficulty
 

Après si ça marche avec le HAVING, vu que j'ai pas envie de me lancer dans une explication sur les différences entre un join, un where et un having... Eh bien t'as qu'à laisser comme tu sens.


Message édité par anapajari le 08-07-2008 à 15:28:15

---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 08-07-2008 à 15:27:27   

Reply

Marsh Posté le 08-07-2008 à 15:49:24    

YESSSS ! Ca marche !
Merci beaucoup. C'est vachement plus joli :)
 
Je comprend pas pourtant, dans mes essais hier, j'étais pas très loin de ça :(
 
Pour les explications, t'inquiètes, j'irais les chercher où il faut, mais malgré l'explication c'est pas toujours facile de passer à la pratique, donc...
 
C'était peut-être lié à access (je sais bien qu'il ne fait pas les choses très proprement), mais vu que j'avais que ça pour tester en l'absence de ma base de donnée...
 
En tout cas merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed