mysqlleftjoin去重_SQLLEFTJOIN数据去重复
实例:查询当前⽤户参与过的流程实例(instance)
关系:每个实例 (instance)对应多个任务(task),task关联办理⼈(userId)
select inst.*
from instance inst
left join task t on inst.id = t.inst_id
where t.user_id = #{userId}
这样查询后,如果⼀个⼈办理同⼀个流程中的多个任务,则会重复查出相同的instance。
其实 join 关键词查询“⼀对多”关系的数据,查询之后的结果的记录数,是和“ 多端 ”保持⼀致的,也就是“⼀端”的数据会重复。
left join、right join 只是选择保留下左/右端不符合join条件的多余数据,与数据重复问题⽆关,inner join 、outter join 也是。 所以数据的数据去重复,⽆法通过这⼏个关键词解决。
随机数表有多少个数实例分析解决
有⽤户与⾓⾊的“⼀对多”,left join查询如下:
-- LEFT JOIN 查询⼀对多的关系,“⼀端”会重复
SELECT
u.id,
<,
web前端工程师证书含金量u.nl,
u.lxfs,
u.bzsm,
r.id roleId,
r.jsmc,
r.sm
FROM
test_user u
LEFT JOIN test_role r ON u.id = r.user_id
解决⽅法⼀: 结果使⽤group by 去重
将查询结果作为中间表,使⽤group by 进⾏去重:
-- 关联查询出结果,再使⽤group by 去重
select tmp.* from (
SELECT
u.id,
<,
u.nl,
u.lxfs,
u.bzsm,
diversity essayr.id roleId,
r.jsmc,
r.sm
FROM
test_user u
LEFT JOIN test_role r ON u.id = r.user_id
)mysql面试题acid
tmp group by tmp.id;
getparameter获取不到值
解决⽅法⼆: “多端”使⽤group by 去重
去重“多端”的数据(中间表变成⼀对⼀),再关联。分析重复的原因,就是就是有多个⾓⾊对应同⼀个user_id,所以,将⾓⾊去重,变成“⼀对⼀”关系,再关联查询。
-- 去重“多端”的数据(中间表变成⼀对⼀),再关联
SELECT
u.id,
函数sumif是怎么用的u.mc,
u.nl,
u.lxfs,
u.bzsm,
tmp_r.id roleId,
tmp_r.jsmc,
tmp_r.sm
FROM
test_user u
LEFT JOIN (
select r.* from test_role r group by r.user_id
) tmp_r ON u.id = tmp_r.user_id
解决⽅法三:使⽤ EXISTS
上述两种⽅法,其实对“多端”保留哪条数据是没有要求的(除⾮⾃⼰再重新定义test_role的去重⽅法),所以,与exists的查询效果相同。
尤其在开篇的实例中,“ 查询当前⽤户参与过的流程实例(instance) ”,即与参与哪个task⽆关时,使⽤exists更符合业务逻辑。
-- exists
SELECT u.*
FROM
test_user u
WHERE EXISTS (
select * from test_role r where r.user_id = u.id
);
相关推荐阅读:数据库事务
⼀、事务的基本要素(ACID) 1、原⼦性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执⾏过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发⽣⼀样。也就是说事务是⼀个不可分割的整体,就像化学中学过的原⼦,是物质构成的基本单位。 事务开始后所有操作,要么全部做阅读更多数据库事务[...]...
Mycat 常⽤的分⽚规则
分⽚枚举 通过在配置⽂件中配置可能的枚举 id,⾃⼰配置分⽚,本规则适⽤于特定的场景,⽐如有些业务需要按照省份或区县来做保存,⽽全国省份区县固定的,这类业务使⽤本条规则,配置如下:
Elasticsearch 常⽤查询和Http请求笔记
创建索引: 查询索引 删除索引 _search 查询 _search DSL查询 term与match的区别: term不会对查询的关键词进⾏分词,⽽是进⾏精确匹配,match会先对关键词进⾏分词,再查询。 对查询词进⾏分词:...
Redis数据类型和常⽤命令操作
redis是以set/get⽅式存储和获取数据的key-value存储系统 。 redis有五种数据类型:string、list、hash、set、zset。对于不同的数据类型,⼜不同的操作。 Redis常⽤操作 string类型操作 hash类型操作 list类型操作 set类型操作 zset类型操作 zset类型中阅读更多Redis 数据类型和常⽤命令操作[...]...
Redis常⽤命令以及应⽤场景
如果存储序已经列化的对象,可以使⽤如下格式的key User::id::{id} 缓存 1.可⽤来缓存对象,将对象序列化为字符串后,使⽤格式如User::id::{id}的key存储获取。可使⽤到命令: SET key value [EX seconds]...
从配置⽂件学redis–Redis持久化备份
RDB快照 >>>>>>## SNAPSHOTTING >>>>>>#### Save the DB on disk:##  ...
Memcached k-v 存储
安装 yum install memcached 运⾏ memcached -p 11211 -
Redis事务
Redis 事务可以⼀次执⾏多个命令。将多个命令加⼊⼀个队列中,使⽤exec执⾏。执⾏过程中不会被其他命令打断,但是在命令被加⼊队列过程中出错,整个队列的命令都不会被执⾏。 Redis事务命令 命令 说明 multi 开启事务 exec 提交(执⾏)事务

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论