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,记录半个互联网人的技术与思考,感兴趣的可以关注.