我有一个包含userid
列和createdon
列的mysql表,其中createdon
列的数据类型为DATE
。
---------------------------------------------------------------------------------
ID UserId CreatedOn
1 65 2013-06-13
2 54 2013-07-03
3 34 2013-08-23
4 65 2013-09-13
5 89 2013-09-13
现在我想要在2013-09-08之前创建 last 的用户标识。正确的答案是用户ID 54,34
使用
select userid from table where createdon <'2013-09-08'
返回65,54,34和usind
select userid from table where userid notin (select userid from table where createdon > '2013-09-07')
花了很多时间。
如何获取最后创建的行&lt; 2013年9月8日
答案 0 :(得分:6)
尝试
SELECT UserID, MAX(CreatedOn) CreatedOn
FROM table1
GROUP BY UserId
HAVING CreatedOn < '2013-09-08'
输出:
| USERID | CREATEDON | |--------|-------------------------------| | 34 | August, 23 2013 00:00:00+0000 | | 54 | July, 03 2013 00:00:00+0000 |
这是 SQLFiddle 演示
答案 1 :(得分:0)
你的期望是错误的。您发布的表格的第一行符合您的条件( '2013-06-'13' < '2013-09-08'
)。因此65,54,34
的结果集符合预期。
误解了这个问题。
你想要的是:
SELECT DISTINCT
UserId
FROM
tbl outerTbl
WHERE NOT EXISTS (
SELECT *
FROM tbl innerTbl
WHERE
outerTbl.UserId = innerTbl.UserId
AND innerTbl.createdOn >= '2013-09-08'
)
答案 2 :(得分:0)
尝试使用STR_TO_DATE()
功能
SELECT userid FROM table
WHERE createdon <= STR_TO_DATE('2013-09-08', '%Y-%m-%d')
答案 3 :(得分:0)
您的查询是正确的,但可能您没有为createdon
列使用正确的数据类型。检查它在SQLFiddle:
SELECT userid
FROM mytable
WHERE createdon < '2013-09-08'