2012-06-08 3 views
-1

j'ai ce tableau MySql (scores):requête d'exclusion MYSQL sélectionnez

id userId gameId score1 score2 idPaisesL idPaisesV 
59 1  11  1  1  229   173 
57 1  11  1  0  229   173 
58 1  11  2  1  229   173 
56 1  11  2  2  229   173 
53 1  11  7  7  229   173 
52 1  11  3  5  229   173 
51 3  11  6  6  229   173 
50 3  11  6  6  229   173 
49 3  11  5  5  229   173 
48 1  11  5  0  229   173 
47 1  11  2  3  229   173 
46 1  11  1  0  229   173 
23 1  1  5  3  173   52 
54 1  11  2  0  229   173 

je veux sélectionner uniquement le dernier résultat de chaque userId avec gameid = 11 Comment puis-je faire? aidez plz.

+0

Je souhaite que les fonctions fenêtrées prises en charge par MySQL. –

+2

La plupart des gens utiliseraient une requête de sélection, mais c'est juste une supposition ... Montrez ce que vous avez essayé et nous essaierons d'aider à le résoudre. Nous n'écrivons pas le tout pour vous. –

+0

[Qu'avez-vous essayé?] (Http://www.whathaveyoutried.com/) –

Répondre

1

Peut-être quelque chose comme ceci:

SELECT 
    * 
FROM 
    scores AS t 
    JOIN 
     (
      SELECT 
       MAX(t2.id) AS maxID 
      FROM 
       scores AS t2 
      GROUP BY 
       t2.userId 
     ) AS Latest 
     ON t.id=Latest.maxID 
WHERE 
    t.gameId=11 
+0

Nice !! Merci beaucoup! – user995691

+0

Pas de problème. Heureux d'aider: P – Arion

1

Je suppose ici que id est toujours croissante de nouvelles entrées et « dernier résultat » est l'entrée la plus haute id pour ce combo utilisateur/jeu:

SELECT * 
FROM scores a 
WHERE gameId = 11 
    AND id = (
    SELECT MAX(id) 
    FROM scores b 
    WHERE a.userId = b.userId 
     AND a.gameId = b.gameId 
) 

Cela peut ne pas être le plus performant , parce que MySQL a tendance à avoir des problèmes avec des sous-requêtes dans mon expérience.


Si vous utilisez une autre base de données qui avait des fonctions OLAP, vous pourriez faire quelque chose comme si (sqlfiddle example):

SELECT * 
FROM (SELECT s.*, 
      ROW_NUMBER() OVER (PARTITION BY userID, gameID ORDER BY id DESC) AS RN 
     FROM scores s) 
WHERE RN=1 
    AND gameID=11 
1

Si par « dernier » vous avez l'intention d'une avec le plus haut id:

SELECT * 
FROM scores s1 
LEFT JOIN scores s2 ON s1.userId = s2.userId AND s1.id < s2.id 
WHERE s2.id IS NULL 
    AND gameId = 11; 

Pas sous_requête, belle performance, bon modèle pour apprendre

:)
+1

C'est un bon motif, je n'aurais jamais pensé à ça, même si je me souviens maintenant de l'avoir fait il y a des années, toujours plus facile de penser à la sous-requête de nos jours – Woody