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(用户记录表)表格。

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

以下是项目表的字段

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

 

 显示的页面

 

(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

结果为: 

如果现在全部查出来呢? 

 (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

 

 (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)

猜你喜欢

转载自blog.csdn.net/MyxZxd/article/details/107044068