建表:
注意:这些建表语句,是先删除表,再创建的,如果有表,删除drop语句。
DROP TABLE IF EXISTS `lyb_activity`;
CREATE TABLE `lyb_activity` (
`id` varchar(32) NOT NULL,
`create_time` datetime DEFAULT NULL,
`status` int(11) NOT NULL,
`title` varchar(100) DEFAULT NULL,
`user_id` varchar(32) DEFAULT NULL,
`vote_status` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `lyb_activity_judge`;
CREATE TABLE `lyb_activity_judge` (
`id` varchar(32) NOT NULL,
`activity_id` varchar(32) DEFAULT NULL,
`user_id` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `lyb_activity_work`;
CREATE TABLE `lyb_activity_work` (
`id` varchar(32) NOT NULL,
`activity_id` varchar(32) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`doc_file_id` varchar(32) DEFAULT NULL,
`title` varchar(100) DEFAULT NULL,
`vote_num` int(11) NOT NULL,
`score` double NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
表名1:lyb_activity
表名2:lyb_activity_judge
表名3:lyb_activity_work
查询:查询表1的所有属性,以及表2关联表1的数量,以及表3关联表1的数量。
语句如下:
select a.*,count(distinct j.id) as '表2关联数量',count(distinct w.id) as '表3关联数量'
from lyb_activity a
left join lyb_activity_judge j on a.id = j.activity_id
left join lyb_activity_work w on a.id = w.activity_id
group by a.id order by a.create_time asc;
查询结果:
如果不加distinct,那么查询出来的统计的数量不正确,count的数量是两个count的正确值的乘积。
因为left join 表时,以 lyb_activity 为基础,lyb_activity_judge 如果有3条记录,lyb_activity_work 有2条记录,那么查询出来的数据条数,是 关联的两个表的数据条数的乘积,即查询出6条数据,然后再count时,两个count的值就都是6了,而不是一个3,一个2。