2010-11-10 6 views
1
user_id | user_destination | user_date_out | user_date_in | user_purpose | uid 
0095 | NYC    | 2010-11-25 | 2010-11-26 | Work   | 1 
0105 | Seattle   | 2010-11-15 | 2010-11-20 | Work   | 2 
0095 | Home    | 2010-11-10 | 2010-11-11 | Personal  | 3 
| Nashville  | 2010-11-10 | 2010-11-12 | Doctober  | 4 

J'ai les données ci-dessus dans une table MySQL. J'ai besoin d'une requête qui produira la ligne si c'est le user_date_out le plus récent pour cet user_id. Difficile à expliquer, mais les lignes qui devraient être affichées via la requête sont les uid 2,3 et 4 (UID 1 tomberait parce que user_date_out est "plus ancien" que UID 3 pour le même utilisateur). Est-ce que quelqu'un peut m'aider avec ça? Merci d'avance!Aide à la requête MySQL (résultats semi-uniques)

EDIT: Je l'ai résolu en utilisant la requête suivante:

SELECT * 
FROM `table` 
WHERE `uid` = (
    SELECT `uid` 
    FROM `table` as `alt` 
    WHERE `alt`.`user_id` = `table`.`user_id` 
    ORDER BY `user_date_out` 
    LIMIT 1 
) 
ORDER BY `user_date_out` 
+1

Trouvé: http://stackoverflow.com/questions/924494/mysql-group-by-ordering – krx

+0

@krio, ça a aidé !! J'ai supprimé la dernière "limite 3" et retiré DESC de la commande, et j'ai obtenu les résultats dont j'avais besoin! Merci pour votre aide! – Trevor

+0

@krio - pouvez-vous coller cette réponse dans une réponse ici? – warren

Répondre

3

Par demande

SELECT * 
FROM `table` 
WHERE `uid` = (
    SELECT `uid` 
    FROM `table` as `alt` 
    WHERE `alt`.`user_id` = `table`.`user_id` 
    ORDER BY `user_date_out` 
    LIMIT 1 
) 
ORDER BY `user_date_out` 
+0

Cela ne retournera que l'uid 3. Je dois retourner 2, 3 et 4. Ceci est évidemment juste des données d'exemple, donc je ne peux pas simplement "wehre user_id = '0105' et ''". J'espère que cela a un peu de sens. C'est déroutant pour moi d'essayer d'expliquer. Merci pour votre réponse. – Trevor

+0

Sans l'endroit où vous devriez être bon tel quel. Je pense que vous l'avez examiné juste avant ma modification. Cela va rassembler un seul enregistrement par user_id avec la dernière date – krx

+0

Je dois avoir vu votre réponse juste avant la modification. ;-) Cela ne fonctionne toujours pas, malheureusement. Je pense que c'est parce que MySQL groupe le champ user_id avant de les commander, donc il attrape toujours UID 1 au lieu de UID 3 pour user_id 0095 – Trevor

1
SELECT t.*, a_subquery.min_user_date_out 
    FROM your_table t 
     JOIN (SELECT user_id, MIN(user_date_out) AS min_user_date_out 
       FROM your_table 
      GROUP BY user_id) a_subquery 
     ON a_subquery.min_user_date_out = t.user_date_out 
     AND a_subquery.user_id = t.user_id 

Depuis MySQL a parfois des problèmes w/sous-requêtes, voici la même requête équivalente à une jointure d'auto-exclusion:

SELECT t.* 
    FROM your_table t 
     LEFT JOIN your_table t2 
     ON t.user_id = t2.user_id 
     AND t.user_date_out > t2.user_date_out 
WHERE t2.user_id IS NULL 

Notez que ces deux requêtes ne fonctionneront pas si vous avez plusieurs user_date_out pour un user_id donné.

+0

Pour une raison quelconque, cela ne renvoie que 1 résultat. Je pense que je l'ai résolu, cependant! – Trevor