2010-11-10 99 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 

我在MySQL表中有上述数据。如果它是该user_id的最新user_date_out,我需要一个将输出该行的查询。很难解释,但应通过查询显示的行是uid 2,3和4(UID 1会因为user_date_out比同一用户的UID 3“旧”而下降)。谁能帮我这个?提前致谢!MySQL查询帮助(半独特结果)

编辑:我解决它通过使用以下查询:

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

发现这:http://stackoverflow.com/questions/924494/mysql-group-by-ordering – krx 2010-11-10 23:06:28

+0

@ krio,这有帮助!我删除了最后的“限制3”,并从命令中删除了DESC,并且我得到了我需要的结果!感谢你的帮助! – Trevor 2010-11-10 23:14:29

+0

@krio - 你可以在这里将答案粘贴到答案中吗? – warren 2010-11-10 23:23:40

回答

3

每请求

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

这将只会返回uid 3.我需要返回2,3和4.这显然只是示例数据,所以我不能只是“选择wehre user_id ='0105'和' 0123' ”。希望这有点道理。我试图解释是令人困惑的。感谢您的答复。 – Trevor 2010-11-10 22:44:32

+0

没有你应该好的地方。我想你在编辑之前就已经对它进行了审查。这将收集每个user_id最近的日期 – krx 2010-11-10 22:48:45

+0

我记得在编辑之前你的答案。 ;-)不幸的是,这仍然行不通。我认为这是因为MySQL在订购它们之前将user_id字段分组,所以它仍然抓取UID 1而不是UID 3 for user_id 0095 – Trevor 2010-11-10 22:51:33

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 

从MySQL有时有问题瓦特/子查询,这里是用相同的等效查询自我排斥加入:

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 

请注意,如果给定的user_id有多个user_date_out,则这两个查询都不起作用。

+0

由于某种原因,这只返回1个结果。不过我想我已经解决了! – Trevor 2010-11-10 23:13:36