mysql的组内排序(取出最大,最小的一条记录)

mysql的组内排序(取出最大,最小的一条记录)这样的需求在工作中非常常见,到网上查找,有好多种解决办法,我经过多种比较测试,认为先排序、后分组的做法是最有效的,也是最容易理解的。

模拟一个稍微复杂点的例子来简单讲述这个过程。

查找用户的首单记录(包含用户注册日期,首单时间,首单商品)
users表:userid,registerdate
orders表:orderid,userid,orderdate,goodscode

那么sql应该如此写:

select * from (
    select t1.userid,t1.registerdate,t2.orderid,t2.orderdate,t2.goodscode
    from users t1
    left join orders t2 on t1.userid = t2.userid
    order by t2.orderdate
) t
group by t.userid
order by t.registerdate

上述的语句有几点需要说清:
1,此语句在oracle中是不行的,在mysql中,select的字段可以超出group设定的范围,这个是mysql的便捷之处,但是不是标准sql。
2,内层是排序,外层是分组,一旦内层排好序了后,外层的分组保证拿到的是按照排序好的次序,绝对不会混乱。

mysql的时间字段如何设置为支持毫秒

mysql的时间字段类型,datetime,timestamp,我用的都是精确到秒,格式为 yyyy-MM-dd HH:mm:ss ,但是如何让这2个字段支持毫秒呢, 也就是格式为:yyyy-MM-dd HH:mm:ss.SSS。

这篇文章 https://blog.csdn.net/mchdba/article/details/75259947 写得挺好的,但是他给的那个官方文档没有链接,我这里给出:Fractional Seconds in Time Values,可以看到mysql从 5.6 开始支持毫秒,而在 mysql 5.5 是不支持毫秒的。可以从官方的文档上有个下拉框可以选择 5.5 的版本,看到是不支持毫秒的,那么5.5对于毫秒该怎么办?只能将时间转为long型后存储,存取的时候需要进行转换。

DATETIME(3),TIMESTAMP(3) 括号中的数字是表示小数位取几位,一般我们取得是 3位,所以写3 即可。