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

文章目录

      • 1 摘要
      • 2 问题复现
      • 3 解决办法

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,记录半个互联网人的技术与思考,感兴趣的可以关注.
MySQL SELECT COUNT 一对多关联查询去重_第1张图片

你可能感兴趣的:(Java)