100分求 sql group by 问题

来源:百度知道 编辑:UC知道 时间:2024/09/22 08:23:19
想做一个学生选课系统,表1为学生表,表2为课程表,表3为关联关系表,
分别如下:
表1: user 学生表
uid(索引),
uname

表2:cause 课程表
cid(索引),
cname

表3: u_c 关联表
uid(索引),
cid(索引)

其中user表20万记录,cause表有3万条记录。
u_c有60万条左右。

我现在想搜索学生的选课情况,并且根据每个学生选课量排序,写的sql语句如下:
select u.uid,u.name,count(c.cid) as num
from (user as u , cause as c on u.id)
left join u_c as uc on (uc.cid=c.cid and uc.uid=u.uid)
group by u.uid
order by num desc
limit 0,30

这个语句执行起来慢的要命,所以想请教各位前辈帮忙解决一下。
解决后我将追加 200分。
另外,不知道这个索引建的合理不合理,请顺便也帮我看看~ 小弟跪谢了!!

首先索引建的还是合理的,但是在开放选课系统的时候一定要删了索引
的确索引会提升查询效率,但这是对于不常更改数据的表而言
当系统要经常增删改时,增加索引会大大影响增删改的效率
select u.uid,u.name,count(uc.cid) as num
from user u
left join u_c uc on uc.uid=u.uid
group by u.uid,u.name
order by 3 desc
limit 0,30
2表关联快很多

还有课程是course不是cause

使用的是mysql吧!
你只要每个学生的选课量,又不需要明细就没有必要将cause表关联起来了!!
所以使用user 和u_c 就足够了!!

select u.uid,u.name,count(*) as num from user u ,u_c c where u.uid=c.uid group by u.uid,u.name order by count(*) desc limit 0,30

U_C 表里面的 cid 从索引中去掉~!!!!

你会有很惊人的发现!!!!!

我以前也以为索引建的越细越好,
但是你想想, 跟字典的道理一样, 每一个字都建个索引,你查字的速度会快吗?
还是对每个字的拼音第一个字母建索引, 然后用整个字的拼音建索引快呢?
相通了, 你就知道索引具体应该怎么用了~~~

可以考虑用嵌套语句,那样对缩小结果集查询比较好点

select a.uid,a.name,count(*) as num from user a,cause b,u_c c
where a.uid=c.uid
and c.cid=b.cid
group by a.uid,a.name
order by num desc
limit 0,30