MySQL 使用


MySQL 使用


引言

这里写一些MySQL使用中碰到的小问题和注意点。

FROM_UNIXTIME()

一般数据表中会用时间戳来表示时间,这时候就可以用FROM_UNIXTIME()转换时间戳为时间。

格式:FROM_UNIXTIME(unix_timestamp, format)

用法,SELECT FROM_UNIXTIME(599462400) AS Unix; 返回 1988-12-29 22:20:00

看个例子,获取当日的日志信息:

SELECT
    ip,
    COUNT(*) as num
FROM
    yp_admin_log
WHERE
    FROM_UNIXTIME(created_at, "%Y-%m-%d") = date_format(NOW(), "%Y-%m-%d")
GROUP BY
    ip;

在MySql从5.7版本开始默认开启only_full_group_by规则,规则核心原则如下,没有遵循原则的sql会被认为是不合法的sql。

所以FROM_UNIXTIME()使用时要注意遵守规范:

    SELECT
        FROM_UNIXTIME(created_at, "%Y-%m-%d") as date,
        COUNT(*) as num 
    FROM
        yp_admin_log 
    GROUP BY
        FROM_UNIXTIME(created_at, "%Y-%m-%d")
    ORDER BY FROM_UNIXTIME(created_at, "%Y-%m-%d") desc  limit 30;

SQL_CALC_FOUND_ROWS

看一个SQL语句:

SELECT SQL_CALC_FOUND_ROWS * FROM `user` WHERE `status` IN ( '3' ) ORDER BY id ASC;

SQL_CALC_FOUND_ROWS 是什么?

SQL_CALC_FOUND_ROWS是MySQL中的一个特殊修饰符,用于执行在应用LIMIT分页限制的同时获取符合条件的总行数, 而不仅仅是返回查询结果的部分数据。

当使用LIMIT条件来限制查询结果的数量时,数据库只会返回满足条件的前N行数据,而不会告诉你总共有多少行符合查询条件。 这对于实现分页功能时可能会有问题,因为你无法知道总共有多少行数据,从而无法生成正确的分页导航。

而使用SQL_CALC_FOUND_ROWS,可以在执行带LIMIT的查询时,附带统计一下如果不加LIMIT的话将会输出多少条结果。 在得到数据后,通过FOUND_ROWS()可以得到不带LIMIT的结果数。






参考资料


返回