MySQL SELECT COUNT 一对多关联查询去重

1 摘要

在实际项目中,通常会遇到多表关联查询的问题,这个时候在做分页查询的时候,可能会出现因关联关系而导致查询数量不正确的问题。如一对多 关系时,统计 的一方数量,这时使用 SELECT COUNT 就容易出现统计数目不准,有重复的现象。

2 问题复现

举例:
有一用户表(user) 和一张 用户图像表(user_photo),用户表与用户图像表属于一对多关系,即一个用户可以拥有多张图像
用户表:

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id 主键',
  `user_name` varchar(30) DEFAULT NULL COMMENT '用户名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

用户图像表:

DROP TABLE IF EXISTS `user_photo`;
CREATE TABLE `user_photo` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '用户相册 id',
`user_id` bigint NOT NULL DEFAULT 0 COMMENT '用户 id',
`photo_url` varchar(255) NULL DEFAULT '' COMMENT '用户图片链接地址',
PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户图像表';

要求: 使用分页查询用户信息,用户信息中需要包含用户的图像

查询语句:
统计用户数量:

SELECT COUNT(u.id)
FROM `user` u 
LEFT JOIN `user_photo` up ON up.user_id = u.id

查询结果:

16

实际用户数量为:

SELECT COUNT(*) 
FROM `user`;

结果为: 11

这时就出现了查询数量不准确的问题,因为是属于一对多的关系,所以,如果一个用户有两张图像的话,查询就会出现两条结果,从而导致查询数量不准确

3 解决办法

使用 DISTINCT 去除重复,保证每一个用户具有唯一性

具体查询:

SELECT COUNT(DISTINCT(u.id))
FROM `user` u 
LEFT JOIN `user_photo` up ON up.user_id = u.id

查询结果为: 11
符合实际用户数量

个人公众号:404Code,记录半个互联网人的技术与思考,感兴趣的可以关注.
404Code

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值