大概数据如下目前
主表A
主表主键     学生编码
aid          code
1             小明
2             小红
2             小忆子表1-B
子表主键   主表主键   
bid           aid      科目   分数
1               1      数学   100
2               1      语文   99
3               1      英语   77
4               2      数学   66
5               2      语文   77
6               2      英语   33
子表2-C
子表主键   主表主键   
cid           aid      补课类型   次数
1               1      补数学课   5
2               1      补语文   5
3               1      补英语   4
4               2      补数学课   2
5               2      补语文   1
6               2      补英语   3
最终我想展示的是
学生    数学    数学补课次数
小明      100       5
小红       66       2这样的数据 然后我使用的是主子查询。 发现数据好慢。谁有更好的优化查询速度的方法?select 
A.code as 学生,
(select B.分数 from B where B.aid = A.aid and B.科目='数学') as 数学,
(select C.次数 from C where C.aid = A.aid and C.补课类型='补数学课') as 数学补课次数,
 from A这么发现数据的确是对的。但是速度实在太慢了.. 谁有快速的一些的方法?

解决方案 »

  1.   

    三个表的aid都加上索引
      

  2.   

     create index x1 on B(aid,科目);
     create index x2 on C(aid,补课类型);
      

  3.   

    经典的行转列问题:页面希望显示成这样: 列头1 列头2 列头3
    行头1       0                  0                0  
    行头2       0                  0                0数据库表中数据形式:
    Corp      name sex
    监狱1   人1   男
    监狱2   人2   女
    监狱3   人3  未知
    … 
    解决办法:行转列
    select corp ,
    SUM(CASE WHEN xb = '男' then 1 else 0 end ) as 'male',
     SUM(CASE WHEN xb = '女' then 1 else 0 end ) as 'female',
     SUM(CASE WHEN xb = '未知' then 1 else 0 end ) as 'unknown'
    FROM XXX
    GROUP BY corp;这个能帮到你吗?
      

  4.   

    效果:学生  数学  数学补课次数 语文 语文补课次数。大概sql如下:select 学生id,
    SUM(CASE WHEN 科目id = '001' then 分数 else 0 end ) as '数学',
    SUM(CASE WHEN 补课类型id = '101' then 次数 else 0 end ) as '数学补课册数',SUM(CASE WHEN 科目id = '002' then 分数 else 0 end ) as '语文',
    SUM(CASE WHEN 补课类型id = '102' then 次数 else 0 end ) as '语文补课册数',....FROM 
    学生表,成绩表,补课表where
    id条件关联GROUP BY 学生id;