多表查询过滤重复数据_[练习]数据库多表查询

之前Django做了一个网站,其中关于课程有3张表:

  1. course_course,
  2. auth_user,
  3. course_course_student,

分表记录了课程信息、学生信息、学生参与课程的对应关系。

其中前2张表有对应的数据模型,而第3张表则是根据指定了ManyToManyKey自动生成:

  9 class Course(models.Model):
 10     ……
 11     student = models.ManyToManyField(User, related_name='courses_joined', blank=True)

里面只有3个字段:

pragma table_info(course_course_student);

d53aaa8d42e1aa444fce8e078ac7179f.png

下面来练习使用SQL语句,实现这样几个查询:

查看每个course有哪些student | 统计每个user有多少个couse | 统计每个course有多少个student

1、查看每个course有哪些student

504d10462e4200eba71639c0beec8773.png
这里联合了3张表,2个过滤条件……

12ecdb8802026c4a7c53f3211addcc29.png
也可以用left outer join,效果是一样的!

注意联合N张表,想要得到有意义的结果而不是泛泛的笛卡尔乘积,至少(N-1)个过滤条件、(跟图论某个结论很像?N个节点的图,至少N-1个线才能连通,多一个就不是最小连通)

2、不过这样罗列可不够,希望1个course只出现一次,后面跟一串student名字。

5e52c59d441735e2f07cfc4e7c49f153.png
group by用于统计,直接group by拿不到想要的结果……

单独加group by title ,效果是:每个title只出现一次,username也只有第一个会出现……

要展示全部,用group_concat(username)。此处感谢 @SummerEnds 。

aaf0f1b21fa400da0cab3b2d67a5d371.png
group_concat(student)

3、统计每个course有多少个student参与吧,名字其实是不重要的。

96067d2866f73bb1ff28bb06c633fd9e.png

4、course和student是多对多的关系,反过来统计每个student参与了多少course:

用inner join可以,不过没有参加course的student不在此列:

4f63889d7994e0b13d1e76c52b5d0e5b.png
inner join

想要统计到所有的student,包括参与course为0的,应该用外联:

b02b0f3624cff9681629d04ae5b4490a.png
left outer join

注意这里select中不能用count(*),否则会得到错误的结果:

0fec52d81f3c8a9dd594778a8d55fffe.png
没有参与任何课程,也被统计为1

所以要指定count(courseid),course_id存在才count += 1。

暂时这样!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值