mysql union left join_MySQL中的LEFT JOIN 和UNIONALL的联合使用

一、基础知识

(1)SQL LEFT JOIN 关键字

LEFT JOIN 关键字会从左表(table_name1)那里返回所有的行,即使在右表(table_name2)中没有匹配的行

语法:

SELECT column_name(s)

FROM table_name1

LEFT JOIN table_name2

ON table_name1.column_name=table_name2.column_name

(2)SQL UNION 操作符

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

语法:

SELECT column_name(s) FROM table_name1

UNION

SELECT column_name(s) FROM table_name2

二、实战

(1)项目描述

现在有两个表,一个是project(项目表)还有一个是user_project_record(用户记录表)表格。

用户记录表里面存储的是用户已经看过的项目,项目表中存储的是所有需要看的项目。

以下是项目表的字段

b81492a561ec7d5cafb83f6199458227.png

以下是用户记录表中的字段

50ad34fb3e59bda868587fad254b4931.png

显示的页面

74b88a2dab7b84cd37bd7ec651599fb5.png

(2)需求描述

首先在这个页面需要展示的是用户还没有看过的项目的前四条包括计算机和英语。

(3)思路分析

从这个页面可以看出,英语、计算机是项目的类型,所以通过项目的类型可以分出计算机和英语,接着,我查询这个用户的用户记录表,然后Not in 在项目表的,这样就可以获取这个用户还没有看过的项目了。但是用户没有看过的项目中有父级项目也有子级项目,所以应该同一级的进行比较,然后返回前四条。

(a)查询项目的等级为1项目类型为0(计算机)的项目的id和优先级从t_project(表中)

SELECT id as parentId,priority as parentPriority FROM t_project  WHERE project_level=1 and project_type=0

结果为:

60a6ce69e1e295a47e2fae056fefd699.png

如果现在全部查出来呢?

ed32c9f0cbc5d2c74c15d59c1bf703fe.png

(b) 查询t_project表然后左连接刚才查的项目的等级为1和项目类型为0的Id和优先级,然后条件为 Parent_id = p2.parentId,这然查找的是

SELECT * FROM t_project p1

LEFT JOIN

(SELECT id as parentId,priority as parentPriority FROM t_project

WHERE project_level=1 and project_type=0) p2 on p1.parent_id=p2.parentId

WHERE project_level=2 AND project_type=0

b6492aeb4c996e46a5274527f31884f6.png

(c)所以查询所有的计算机项目的

(SELECT * FROM t_project p1

LEFT JOIN

(SELECT id as parentId,priority as parentPriority FROM t_project

WHERE project_level=1 and project_type=0) p2 on p1.parent_id=p2.parentId

WHERE project_level=2 AND project_type=0

AND id not in

(SELECT project_id

FROM t_user_project_record

WHERE user_id=1)

ORDER BY parentPriority,periodicity

LIMIT 4)

(d)再用UNION ALL 和英语进行连接

UNIONALL

(SELECT*FROMt_projectp3

LEFTJOIN

(SELECTidasparentId,priorityasparentPriorityFROMt_project

WHEREproject_level=1andproject_type=1)p4onp3.parent_id=p4.parentId

WHEREproject_level=2ANDproject_type=1

ANDidnotin

(SELECTproject_id

FROMt_user_project_record

WHEREuser_id=#{userId})

ORDERBYparentPriority,periodicity

LIMIT4)

三、最终答案

(SELECT * FROM t_project p1

LEFT JOIN

(SELECT id as parentId,priority as parentPriority FROM t_project

WHERE project_level=1 and project_type=0) p2 on p1.parent_id=p2.parentId

WHERE project_level=2 AND project_type=0

AND id not in

(SELECT project_id

FROM t_user_project_record

WHERE user_id=#{userId})

ORDER BY parentPriority,periodicity

LIMIT 4)

UNION ALL

(SELECT * FROM t_project p3

LEFT JOIN

(SELECT id as parentId,priority as parentPriority FROM t_project

WHERE project_level=1 and project_type=1) p4 on p3.parent_id=p4.parentId

WHERE project_level=2 AND project_type=1

AND id not in

(SELECT project_id

FROM t_user_project_record

WHERE user_id=#{userId})

ORDER BY parentPriority,periodicity

LIMIT 4)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值