mysql 函数not exists

52 阅读1分钟

A 表 用户表
B 表 用户角色表

需求: 找出 用户表中,没有角色的用户
常规思路: 找出B表中的数据,A表中 不在B表中的用户id即可;
not exists:

select u.id,u.`name` from upms_user u where not EXISTS (select 1 from upms_user_role_rel r where r.user_id = u.id)

select 1 解读, 这里为什么会好使的呢?
首先 upms_user 与 upms_user_role_rel 通过user_id建立联系的,那么() 括号中的查询其实是找到了所有在角色表中的用户,然后 外面用 not exists,意味着不在当前的集合中,所以是ok的,满足需求,那么select 1 怎么理解呢?

我自己试了一下,无论你写 select 后边跟什么东西,比如表中的哪个字段,他都是成功的; 由于咱们是通过用户id关联的,他已经对用户表进行了过滤,外面还是用户表,所以它是ok的,无论哪个字段,都是不影响结果的;

这个函数专门为了解决一类问题如: 想获取分组后中的最大值的那条记录(或者最小值)

例如: 我想获取每个 dict_code中,每个编码中的最新一条记录或者最后一条记录, 此时用分组是行不通的;那么这就是exists 或者 not exists 的用武之地了;

SELECT * FROM `graph_dict_item` d 
WHERE NOT EXISTS (SELECT 1 FROM `graph_dict_item` g WHERE g.`dict_code` = d.`dict_code` AND g.`create_time` > d.`create_time`)

本文转自 jimolvxing.blog.csdn.net/article/det…,如有侵权,请联系删除。