从最新日期中选择唯一记录的Mysql查询

8
这是我的表结构 -
TABLE : COURSE_LOG

-----------------------------------------------------
|   ID   |   USERNAME   |  COURSE_ID   |    LDATE   |
-----------------------------------------------------
|   1    |     user1    |      22      | 2013-06-01 |
-----------------------------------------------------
|   2    |     user1    |      54      | 2013-06-03 |
-----------------------------------------------------
|   3    |     user1    |      22      | 2013-06-03 |
-----------------------------------------------------
|   4    |     user2    |      71      | 2013-06-04 |
-----------------------------------------------------

我想要挑选出user1的所有COURSE_ID数据(包括日期)。由于相同的COURSE_ID条目之间的日期不同,因此我希望选择最近日期的行。 我希望得到这样的结果 -

-----------------------------
|  COURSE_ID   |    LDATE   |
-----------------------------
|      54      | 2013-06-03 |
-----------------------------
|      22      | 2013-06-03 |
-----------------------------
|      71      | 2013-06-04 |
-----------------------------

And I would not want this -

-----------------------------    
|      22      | 2013-06-01 |    // THIS SHOULD BE OMITTED FROM RESULT BECAUSE THERE
-----------------------------    // IS ANOTHER RECENT ENTRY WITH THE SAME COURSE_ID

我正在使用这个查询 -

SELECT DISTINCT(COURSE_ID), LDATE FROM COURSE_LOG
WHERE USERNAME = 'user1' 
AND LDATE = (
    SELECT LDATE 
    FROM COURSE_LOG
    WHERE USERNAME = 'user1' 
    ORDER BY LDATE DESC 
    LIMIT 1
)

但它只选择了一行。我该怎么纠正这个问题?
2个回答

24

尝试这个查询

如果您只想针对user1使用,请使用此查询:

select username, course_id, max(ldate) as date
from tbl 
where username='user1'
group by username, course_id

SQL FIDDLE

| USERNAME | COURSE_ID |       DATE |
-------------------------------------
|    user1 |        22 | 2013-06-03 |
|    user1 |        54 | 2013-06-03 |

如果您想找出所有用户的最新日期,请使用此查询。
select username, course_id, max(ldate) as date
from tbl 
group by username, course_id

在这个查询中,user2的数据也将被包含在内。
| USERNAME | COURSE_ID |       DATE |
-------------------------------------
|    user1 |        22 | 2013-06-03 |
|    user1 |        54 | 2013-06-03 |
|    user2 |        71 | 2013-06-04 |

对我很有帮助。非常棒的答案,还配有演示。谢谢。 - Samik Sengupta
1
第一个查询在MySQL 5.7.5及以上版本中会返回错误,因为ONLY_FULL_GROUP_BY默认开启,并且'username'列是一个非聚合列,没有包含在GROUP BY子句中。 - user559533
对我来说完美地工作了。 - Jason

3
你可以使用 MAX
SELECT  COURSE_ID
    , MAX(LDATE) AS LDATE
    FROM COURSE_LOG
    WHERE USERNAME = 'user1'
    GROUP BY COURSE_ID;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接