Comment sélectionner des lignes à partir de MySQL en fonction de la valeur maximale d'une colonne + un regroupement
J'ai une table qui contient (disons) toutes les fois où un utilisateur regardé une page web spécifique. Les utilisateurs peuvent bien sûr regarder une page plus d'une fois, donc il peut y avoir plusieurs entrées pour les utilisateurs et les pages, comme suit:
nid time user page_id
25 8000 4 467
24 7000 1 482
23 6000 1 484
22 5000 1 482
21 4000 5 467
20 3000 4 467
Je veux faire une requête qui renvoie les lignes correspondant à chaque page consultées par tout utilisateur AVEC LA prise QUE si un utilisateur regardé une page plus d'une fois, j'obtiens la ligne correspondant à la plus récente de la vue (c'est à dire, la plus grande valeur de TEMPS). Donc, je devrais obtenir ceci:
nid time user page_id
25 8000 4 467
24 7000 1 482
23 6000 1 484
21 4000 5 467
Nous perdons de la ligne 22, car l'utilisateur 1 a regardé à la page 482 à un moment plus tard, et nous perdons de la ligne 20, car l'utilisateur 4 regardé la page 467 à une date ultérieure.
J'ai presque cela compris, mais je ne peux pas le maîtriser, tout en convaincre moi-même que les résultats que j'obtiens sera généralement correcte et pas juste un accident de mon cas de test. Je garde un va-et-vient entre GROUP BY ou DISTINCT des requêtes et intégré des requêtes, et puis mon cerveau explose. Toutes les suggestions? Merci!
source d'informationauteur Jim Miller | 2011-01-28
Vous devez vous connecter pour publier un commentaire.
Si vous avez besoin de la ligne complète, vous pouvez utiliser ceci:
Si vous demandez une colonne à l'extérieur de la clause "group by", mysql peuvent renvoyer une valeur pour cette colonne à l'intérieur de ce groupe. Donc, si toutes les valeurs à l'intérieur du groupe ne sont pas les mêmes, c'est votre cas, vous ne pouvez pas l'inclure directement sur la clause select, vous devez utiliser une jointure.
Vous pouvez en lire plus à propos de pas de colonnes groupées sur MySQL sur la référence
Si vous n'avez pas besoin de le nid de champ, vous pouvez utiliser cette autre:
Essayez ceci: