Ordre SQL SELECT par 2 colonnes et par groupe
Voici la RS de retour et le SQL émis,
SELECT *, (UNIX_TIMESTAMP(end_time) - UNIX_TIMESTAMP(start_time)) AS T
FROM games
WHERE game_status > 10
ORDER BY status, T;
game_id, player_id, start_time, end_time, score, game_status, is_enabled, T
65, 22, '2009-09-11 17:50:35', '2009-09-11 18:03:07', 17, 11, 1, 752
73, 18, '2009-09-11 18:55:07', '2009-09-11 19:09:07', 30, 11, 1, 840
68, 20, '2009-09-11 18:03:08', '2009-09-11 18:21:52', 48, 11, 1, 1124
35, 18, '2009-09-11 15:46:05', '2009-09-11 16:25:10', 80, 11, 1, 2345
13, 8, '2009-09-11 12:33:31', '2009-09-11 15:21:11', 40, 11, 1, 10060
11, 5, '2009-09-11 12:22:34', '2009-09-11 15:21:42', 55, 11, 1, 10748
34, 17, '2009-09-11 15:45:43', '2009-09-11 21:00:45', 49, 11, 1, 18902
2, 1, '2009-09-10 20:46:59', '2009-09-11 23:45:21', 3, 11, 1, 97102
84, 1, '2009-09-11 23:51:29', '2009-09-11 23:51:42', 10, 12, 1, 13
'J'aimerais groupe par player_id, (c'est à dire prendre le meilleur résultat de chaque Player_id, il est déterminé par "game_status - min", et le temps T,
j'ai donc ajouté une clause group by, mais il ne renvoie pas le min
SELECT *, (UNIX_TIMESTAMP(end_time) - UNIX_TIMESTAMP(start_time)) AS T
FROM games
WHERE game_status > 10
GROUP BY player_id
ORDER BY game_status, T;
35, 18, '2009-09-11 15:46:05', '2009-09-11 16:25:10', 80, 11, 1, 2345
13, 8, '2009-09-11 12:33:31', '2009-09-11 15:21:11', 40, 11, 1, 10060
34, 17, '2009-09-11 15:45:43', '2009-09-11 21:00:45', 49, 11, 1, 18902
1, 1, '2009-09-10 20:39:44', '2009-09-10 20:41:21', 10, 12, 1, 97
24, 12, '2009-09-11 14:46:06', '2009-09-11 14:53:30', 10, 12, 1, 444
5, 3, '2009-09-11 10:56:22', '2009-09-11 11:13:01', 11, 12, 1, 999
37, 20, '2009-09-11 15:51:13', '2009-09-11 16:15:04', 14, 12, 1, 1431
79, 31, '2009-09-11 20:34:17', '2009-09-11 20:43:29', 4, 13, 1, 552
18, 9, '2009-09-11 13:09:47', '2009-09-11 18:33:10', 2, 13, 1, 19403
72, 30, '2009-09-11 18:46:29', '2009-09-11 18:48:44', 0, 14, 1, 135
40, 22, '2009-09-11 16:12:39', '2009-09-11 16:18:23', 3, 14, 1, 344
8, 5, '2009-09-11 12:15:54', '2009-09-11 12:21:48', 25, 14, 1, 354
85, 33, '2009-09-12 01:14:01', '2009-09-12 01:20:43', 0, 14, 1, 402
22, 11, '2009-09-11 13:50:41', '2009-09-11 13:57:24', 7, 14, 1, 403
SELECT *, min(UNIX_TIMESTAMP(end_time) - UNIX_TIMESTAMP(start_time)) AS T
FROM games
WHERE game_status > 10
GROUP BY player_id
ORDER BY game_status, T;
Si je sélectionne min(T), il ne renvoie pas le min de la ligne, mais la valeur min sur le maintien de la colonne.
J'avais cherché un peu de méthode, avec auto-jointure, disons, http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/
La sous-requête SELECT min(), mais je ne peux pas question deux min() sur deux colonnes, comme il ne renvoie pas les lignes que je veux.
select type, min(price) as minprice
from fruits
group by type;
J'espère qu'il y a un moyen comme un filtre sur le premier SQL pour supprimer la copie de l'player_id lignes.
- Quel est le "tenir la colonne"? Aussi, que signifie l'expression "il est déterminé par "game_status - min", et le temps T" signifie?
- salut, c'est les champs de la table: game_id, player_id, start_time, end_time, le score, les game_status, is_enabled et le Temps T est cal par (UNIX_TIMESTAMP(end_time) - UNIX_TIMESTAMP(start_time)) COMME T je veux prendre le min game_status pour qui game_status > 10, c'est à dire. tri dans les 11 > 12 > 13 ...
Vous devez vous connecter pour publier un commentaire.
De ce que j'ai pu rassembler, vous voulez voir ce que le temps minimum a été sur la plus haute
game_status
pour unplayer_id
,game_id
combinaison. Essayez ceci:Il semble que vous êtes absent de la fonction MIN et une légère modification à votre filtrage de la clause.
Comme dans:
J'ai déplacé la "> 10" la logique, car je crois que votre intention est de filtrer les joueurs dont le meilleur état du jeu est de moins de dix. C'est un des critères différents de filtrage de jeu individuels entrées d'état qui sont à moins de dix (qui est ce que vous faisiez via la clause where).
De l'essayer. Il semblerait que vous utilisez MySQL, ce qui n'est pas un système de base de données, je suis tout ce que familier avec.
Je suis un peu incertain de certaines phrases dans votre question, mais vous avez besoin de faire un SELECT imbriquées l'exploitation sur les lignes suivantes:
Le " r " à la requête retourne l'ID du joueur et le temps minimum pour que le joueur, qui est joint à la table principale récupération de toutes les lignes pour que le joueur avec le même minimum de temps. Généralement, ce sera une entrée, mais si quelqu'un a deux jeux avec le même temps, la requête renvoie les deux.
Je ne suis pas clair si il y a une autre façon de disambiguating de l'ensemble de résultats; il pourrait être.
Merci pour les réponses.
Je suis à la recherche d'Eric et john solution.
Laissez-moi vous expliquer en détail.
Comme Eric l'a mentionné, je suis à la recherche pour le résultat de game_status et min le temps(T),
J'ai seulement besoin de l'état > 10 , et le classement des plus petites,
(c'est à dire 11 > 12 > 13 > 14, seulement quatre d'état) et de déterminer, à partir de leur temps.
J'ai pris le top 5 des lignes de player_id = 18 à partir de la table:
SELECT *, (UNIX_TIMESTAMP(end_time) - UNIX_TIMESTAMP(start_time)) T
DE jeux où player_id = 18 commande par game_status, T;
Joueur de 18 ans a joué de nombreuses fois de la partie. Il a obtenu des résultats différents(game_status).
Maintenant, nous prenons le meilleur résultat sur chacun des joueurs.
Évidemment, le meilleur résultat pour 18 est
Que le statut est 11, et le temps est de 840.
Noter que le meilleur temps, il a été game_id = 53(Ligne 3 ci-dessus), Nous ne prenons pas ce résultat, que l'état était de 14. Par conséquent, l'utilisation min(UnixTimeSTAMP ... ) n'aide pas comme il 58 jeu de résultats.