我有一个像这样的mysql表
+----------+----------+-------------------+
| entrykey | user_key | validfrom |
+----------+----------+-------------------+
| 1 | 3 | 2016-4-1 0:0:0.0 |
| 2 | 3 | 2016-12-1 0:0:0.0 |
| 3 | 2 | 2016-12-1 0:0:0.0 |
| 4 | 2 | 2016-3-1 0:0:0.0 |
+----------+----------+-------------------+
现在我试图只获得validfrom是最新版本的每个用户的行。所以我正在做这样的查询:
SELECT entrykey, user_key, max(validfrom)
FROM table
Group by user_key;
几乎所有的数据都能正常工作,我在这里发布的这两个例子选择了较旧的错误行。因此,对于user_key 3,它选择entrykey 1,对于user_key 2,它选择entrykey 4。
我做错了什么?
答案 0 :(得分:6)
我想validform
应该是2016-03-01
而不是2016-3-01
,因为它在比较之前没有转换为日期。
答案 1 :(得分:1)
我完全同意接受的答案中的观点(+1)。但是,即使op以某种方式将validfrom
从字符串转换为DateTime
,他的尝试也不会给他想要的结果。
让我们检查一下有问题的查询:
SELECT entrykey, user_key, MAX(STR_TO_DATE(validfrom, '%Y-%c-%e')) as date1
FROM table
Group by user_key;
现在,此查询将返回user_key
,其特定validfrom
的最大值为user_key
。但entrykey
不会是entrykey
最大validfrom
。 (检查演示链接中的第一个结果)
为了实现上述任务,以下查询将正常工作!
SELECT t1.entrykey, t1.user_key, t2.maxdate as MaxDate
FROM t t1
inner join (select user_key,MAX(STR_TO_DATE(validfrom, '%Y-%c-%e')) as maxdate
from t
Group by user_key
) t2
on t1.user_key = t2.user_key and t1.validfrom = t2.maxdate;
Click here for Demo with DateTime as datatype of validfrom
希望它有所帮助!