1

mysql窗口函数去重

1
2
3
4
5
6
7
8
9
10
11
12
13
set @row_number := 0;
SELECT
@row_number:=CASE
WHEN @customer_no = jiedao_zz -- 分组字段
THEN @row_number + 1
ELSE 1
END AS num,
@customer_no:=jiedao_zz jiedao_zz, --
address_ys,
description_ys
FROM
wenshuo_dmdzzh_log_tmp
ORDER BY jiedao_zz

应用自MySQL官方文档 http://www.mysqltutorial.org/mysql-row_number/

表结构
id,
文章id article_id,
创建时间 check_date,
文章状态check_end
一篇文章可能有多个状态,根据不同的创建时间,一开始的编辑中,然后审核,通过
查询每篇文章的最后状态,根据分组函数,和状态创建时间排序,然后循环的时候如果文章ID改变,则计算从头开始。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
set @row_number := 0;
SELECT
@row_number:=CASE
WHEN @customer_no = article_id -- 分组字段
THEN @row_number + 1
ELSE 1
END AS num,
@customer_no:=article_id article_id, --
check_date,check_end
FROM
manuscript_check
ORDER BY article_id, check_date DESC

结果:
num 文章ID 创建时间 文章状态
1 3 2020-03-01 08:21:45 3
2 3 2020-03-01 08:21:43 2
1 5 2020-03-01 08:01:33 1
2 5 2020-03-01 08:01:29 2

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
左连接右连接内连接

1. 内连接
SELECT * FROM sys_user_post p
INNER JOIN
sys_role_menu m on p.user_id = m.role_id;

如果不写INNER默认内连接
如果p.user_id 和 m.role_id列有相同的才输出,并且进行笛卡尔积,
左边两个2,右边3个二,生成六条记录。
左边两个2,右边没有2,则结果中没有2

2. 左连接 LEFT JOIN


3. 右连接 RIGHT JOIN
4. 全连接mysql不支持
5. using()关键字
SELECT * FROM p
INNER JOIN m
on p.user_id = m.role_id;


SELECT * from p
RIGHT join r
using( user_id )