MySQL 使用存储过程去除重复数据

筛选出混合重复,且 user_id 不为 0 的作品

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT
max( id ) AS id,
count( 1 ) AS c ,
number,
reason,
`title`,
org_id,
act_id,
user_id,
created_at
FROM
creations_copy1
WHERE
user_id != 0
GROUP BY
org_id,
`act_id`,
user_id,
created_at
HAVING
c > 1
ORDER BY
c ASC

对混合重复的作品 user_id 改为 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

UPDATE creations_copy1 AS c
SET c.user_id = 0
WHERE
c.id IN (
SELECT
a1.id
FROM
(
SELECT
max( id ) AS id,
number,
reason,
`title`,
org_id,
act_id,
user_id,
created_at,
count( 1 ) AS c
FROM
creations_copy1
WHERE
user_id != 0
AND number = ''
GROUP BY
org_id,
`act_id`,
user_id,
created_at
HAVING
c > 1
ORDER BY
created_at ASC
) AS a1
)

对 user_id=0 并且重复的记录,进行日期自增 1 秒

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
UPDATE creations AS c
SET c.created_at = DATE_ADD( c.created_at, INTERVAL 1 SECOND )
WHERE
c.id IN (
SELECT
a1.id
FROM
(
SELECT
id,
`title`,
org_id,
act_id,
user_id,
created_at,
count( 1 ) AS c
FROM
creations
WHERE
user_id = 0
GROUP BY
org_id,
`act_id`,
user_id,
created_at
HAVING
c > 1
ORDER BY
c DESC
) AS a1)

自增 1 秒后,依然可能会有数据重复,需要多次调用。
这里用到了 MySQL 的存储过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
CREATE DEFINER=`root`@`localhost` PROCEDURE `UpdateProcess`()
BEGIN
UPDATE creations AS c
SET c.created_at = DATE_ADD( c.created_at, INTERVAL 1 SECOND )
WHERE
c.id IN (
SELECT
a1.id
FROM
(
SELECT
id,
`title`,
org_id,
act_id,
user_id,
created_at,
count( 1 ) AS c
FROM
creations
WHERE
user_id = 0
GROUP BY
org_id,
`act_id`,
user_id,
created_at
HAVING
c > 1
ORDER BY
c DESC
) AS a1);
END

创建后,只需要在 MySQL 执行

CALL UpdateProcess();

最后,增加三字段的唯一索引,避免下次出错

Mac上使用brew update会卡住的问题

brew 默认的源是 Github,会非常慢,建议换为国内的源。推荐中科大的镜像源,比较全面.

Homebrew 源代码仓库

替换源地址:
cd”$(brew –repo)”git remote set-url origin https://mirrors.ustc.edu.cn/brew.git
重置为官方地址:
cd”$(brew –repo)”git remote set-url origin https://github.com/Homebrew/brew.git
Homebrew Bottles
Homebrew 预编译二进制软件包
在运行 brew, 前设置环境变量 HOMEBREW_BOTTLE_DOMAIN,值为https://mirrors.ustc.edu.cn/homebrew-bottles
替换源地址:
bash:
echo’export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.bash_profilesource ~/.bash_profile
zsh:
echo’export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.zshrcsource ~/.zshrc
Homebrew Core
Homebrew 核心软件仓库
替换源地址:
cd”$(brew –repo)/Library/Taps/homebrew/homebrew-core”git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git
重置为官方地址:
cd”$(brew –repo)/Library/Taps/homebrew/homebrew-core”git remote set-url origin https://github.com/Homebrew/homebrew-core
Homebrew Cask
Homebrew cask 软件仓库,提供 macOS 应用和大型二进制文件
替换源地址:
cd “$(brew –repo)”/Library/Taps/homebrew/homebrew-cask
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git
重置为官方地址:
cd “$(brew –repo)”/Library/Taps/homebrew/homebrew-caskgit remote set-url origin https://github.com/Homebrew/homebrew-cask

MySQL 按月、周、天、小时统计数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
按周
select DATE_FORMAT(create_time,'%Y%u') weeks,count(caseid) count from tc_case group by weeks;
按月
select DATE_FORMAT(create_time,'%Y%m') months,count(caseid) count from tc_case group by months;
按天
select DATE_FORMAT(create_time,'%Y%m%d') days,count(caseid) count from tc_case group by days;
按小时
select DATE_FORMAT(create_time,'%Y%m%d%H') hours,count(caseid) count from tc_case group by hours;
DATE_FORMAT方法说明
格式:DATE_FORMAT(date,format)
根据format字符串格式化date值。下列修饰符可以被用在format字符串中:
%M 月名字(January……December)
%W 星期名字(Sunday……Saturday)
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 数字, 4 位
%y 年, 数字, 2 位
%a 缩写的星期名字(Sun……Sat)
%d 月份中的天数, 数字(00……31)
%e 月份中的天数, 数字(0……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%b 缩写的月份名字(Jan……Dec)
%j 一年中的天数(001……366)
%H 小时(00……23)
%k 小时(0……23)
%h 小时(01……12)
%I 小时(01……12)
%l 小时(1……12)
%i 分钟, 数字(00……59)
%r 时间,12 小时(hh:mm:ss [AP]M)
%T 时间,24 小时(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一个星期中的天数(0=Sunday ……6=Saturday )
%U 星期(0……52), 这里星期天是星期的第一天
%u 星期(0……52), 这里星期一是星期的第一天
%% 一个文字“%”。
按年汇总,统计:
select sum(mymoney) as totalmoney, count(*) as sheets from mytable group by date_format(col, '%Y');
按月汇总,统计:
select sum(mymoney) as totalmoney, count(*) as sheets from mytable group by date_format(col, '%Y-%m');
按季度汇总,统计:
select sum(mymoney) as totalmoney,count(*) as sheets from mytable group by concat(date_format(col, '%Y'),FLOOR((date_format(col, '%m')+2)/3));
select sum(mymoney) as totalmoney,count(*) as sheets from mytable group by concat(date_format(col, '%Y'),FLOOR((date_format(col, '%m')+2)/3));
按小时:
select sum(mymoney) as totalmoney,count(*) as sheets from mytable group by date_format(col, '%Y-%m-%d %H ');
查询 本年度的数据:
SELECT * FROM mytable WHERE year(FROM_UNIXTIME(my_time)) = year(curdate())
查询数据附带季度数:
SELECT id, quarter(FROM_UNIXTIME(my_time)) FROM mytable;
查询 本季度的数据:
SELECT * FROM mytable WHERE quarter(FROM_UNIXTIME(my_time)) = quarter(curdate());
本月统计:
select * from mytable where month(my_time1) = month(curdate()) and year(my_time2) = year(curdate())
本周统计:
select * from mytable where month(my_time1) = month(curdate()) and week(my_time2) = week(curdate())
N天内记录:
WHERE TO_DAYS(NOW())-TO_DAYS(时间字段)<=N

MySQL this is incompatible with sql_mode=only_full_group_by错误

问题背景:

闯关答题,需要获取用户所有关卡的答题情况,并统计通过的次数分数等

image.png)image.png

一、原理层面

这个错误发生在 mysql 5.7 版本及以上版本会出现的问题:
mysql 5.7 版本默认的 sql 配置是:sql_mode=”ONLY_FULL_GROUP_BY”,这个配置严格执行了”SQL92 标准”。
很多从 5.6 升级到 5.7 时,为了语法兼容,大部分都会选择调整 sql_mode,使其保持跟 5.6 一致,为了尽量兼容程序。

二、sql 层面

在 sql 执行时,出现该原因:
简单来说就是:输出的结果是叫 target list,就是 select 后面跟着的字段,还有一个地方 group by column,就是
group by 后面跟着的字段。由于开启了 ONLY_FULL_GROUP_BY 的设置,所以如果一个字段没有在 target list
和 group by 字段中同时出现,或者是聚合函数的值的话,那么这条 sql 查询是被 mysql 认为非法的,会报错误。

1、查看 sql_mode 的语句如下

1
select @@GLOBAL.sql_mode;

1、解决方案一 (推荐解决方案二)

① 解决方案一:sql 语句暂时性修改 sql_mode

1
set global sql_mode='STRICT_RANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

重启 mysql 数据库服务之后,ONLY_FULL_GROUP_BY 还会出现。
② 解决方案二:完美解决方案。

需修改 mysql 配置文件,通过手动添加 sql_mode 的方式强制指定不需要 ONLY_FULL_GROUP_BY 属性,
my.cnf 位于 etc 文件夹下,vim 下光标移到最后,添加如下:

1
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

重启 mysql 就好。

安装配置 mysql 的时候可能会遇到需要配置 my.cnf 配置文件的情况,但是不管是用 homebrew 还是用 mysql 安装包安装的客户端都不会生成这个文件(官方解释)。

  1. 如果你只是想确认 mysql 加载的是哪个配置文件那你可以使用以下方法进行确认。
1
mysql --verbose --help | grep my.cnf

会得到类似以下的几个地址,默认是在/etc/下的 my.cnf。

  1. 如果你没有使用过 my.cnf,那就必须手动创建一个 my.cnf 目录放在上一条我们看到的几个目录下面,通常/usr/local/mysql/support-files/my-default.cnf 目录下会有一个默认文件,你把它拷贝到指定位置做自定义修改就 ok 了。

附阿里云 rds 增加 ONLY_FULL_GROUP_BY 属性的方法:

  1. 通过相关配置查看 sql_mode 内包含的 SQL 模式,如下所示,确认未设置 ONLY_FULL_GROUP_BY 语法支持。
1
sql_mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_UNSIGNED_SUBTRACTION,NO_DIR_ IN_CREATE,POSTGRESQL,ORACLE,MSSQL,DB2,MAXDB,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,MYSQL 323,MYSQL40,ANSI,NO_AUTO_VALUE_ON_ZERO,NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLES,STRICT_ALL_TABLES, NO_ZERO_IN_DATE,NO_ZERO_DATE,ALLOW_INVALID_DATES,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,HIGH_NOT _PRECEDENCE,NO_ENGINE_SUBSTITUTION,PAD_CHAR_TO_FULL_LENGTH
  1. 执行 select @@global.sql_mode SQL 语句,确认仍然包含 ONLY_FULL_GROUP_BY 参数。
  2. 上述 sql_mode 中包含了 ANSI 参数,而 ONLY_FULL_GROUP_BY 为 ANSI 的子集,所以 sql_mode 会自动设置为 ONLY_FULL_GROUP_BY。

博客从wordpress迁移到hexo

注册域名后,断断续续更新过 wordpress,大部分都是写一些技术的日志,需要的时候可以回看。wordpress 的主题很多,让人眼花缭乱,但是不够简洁。看到 hexo 后,马上被它的简洁吸引住了。

搜了几篇文章,发现只需要简短的几个命令就能搭建起来,还可以不依赖数据库和 ecs,这实在太棒了。

从本地搭建到部署到阿里云 oss 上,前后也只花了几个小时,随后把 wordpress 导出原来的文件,一次性迁移过来(反正 wordpress 上也只有自己看),顺带把域名解析都改了

image.png

简介明了,文章找起来也不麻烦

bookstack安装

一、安装中文字体

1
yum install wqy-microhei-fonts wqy-zenhei-fonts

二、安装 chorme

1
yum install chromium

检测是否安装成功

1
chromium-browser --headless --disable-gpu --dump-dom --no-sandbox https://www.baidu.com

三、安装 calibre

1
sudo -v && wget -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sudo sh /dev/stdin

检测是否安装成功

1
ebook-convert --version
  1. 生成 txt 文件
1
echo "Hello BookStack。你好,书栈。" > test.txt
  1. 转换 pdf
1
ebook-convert test.txt test.pdf

四、安装 supervisor

1
yum  install supervisor

判断是否安装成功:

1
supervisord --version

显示版本号,即表示安装成功。
supervisor 主要用于将程序加入到系统守护进程
Supervisord 安装完成后有两个可用的命令行 supervisord 和 supervisorctl,命令使用解释如下:

  • supervisord,初始启动 Supervisord,启动、管理配置中设置的进程。
  • supervisorctl stop programxxx,停止某一个进程(programxxx),programxxx 为 [program:beepkg] 里配置的值,这个示例就是 beepkg。
  • supervisorctl start programxxx,启动某个进程
  • supervisorctl restart programxxx,重启某个进程
  • supervisorctl stop groupworker: ,重启所有属于名为 groupworker 这个分组的进程(start,restart 同理)
  • supervisorctl stop all,停止全部进程,注:start、restart、stop 都不会载入最新的配置文件。
  • supervisorctl reload,载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程。
  • supervisorctl update,根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。

五、安装源码

六、加入系统守护进行
1、进入 supervisor 的配置目录
cd /etc/supervisor/conf.d/
2、配置守护进程 创建 bookstack.conf 文件,并配置。

1
2
3
4
5
6
7
8
[program:BookStack]
directory = 你的程序目录
command =你的程序执行命令
autostart = true
autorestart=true
user = 启动该程序的用户
redirect_stderr = true
stdout_logfile = 日志地址

配置示例:

1
2
3
4
5
6
7
8
[program:BookStack]
directory = /www/wwwroot/demo.bookstack.cn
command =/www/wwwroot/demo.bookstack.cn/BookStack
autostart = true
autorestart=true
user = root
redirect_stderr = true
stdout_logfile = /var/log/supervisor/BookStack.log

配置完成之后,重启 supervisor

1
supervisorctl reload

v2.0 正式版开始,默认管理员账号密码调整为:

  1. admin
  2. admin888

请我喝杯咖啡吧~

支付宝
微信