忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 2318 | 回复: 5

DBIx::Class查询数据库问题 [复制链接]

论坛徽章:
0
发表于 2017-11-21 19:33 |显示全部楼层
表DEPARSCORE
DEPAR
NAME
SCORE
A
A1
66
A
A2
80
A
A3
55
B
B1
36
B
B2
78
B
B3
74
C
C1
57
C
C2
92




通过这个帖子https://www.cnblogs.com/yes-you-can/p/4801273.html,我写了一个SQL语句,查找每个部门第一名与第二名的分数之差
  1. SELECT cc.*, dd.SCORE2, cc.SCORE1-dd.SCORE2 as '分差' FROM
  2. (
  3.     SELECT DEPAR, MAX(SCORE) AS SCORE1, NAME
  4.     FROM DEPARSCORE
  5.     GROUP BY DEPAR
  6. ) AS cc
  7. LEFT JOIN
  8. (
  9. SELECT MAX(SCORE) AS SCORE2,
  10.        DEPAR
  11.   FROM (
  12.            SELECT aa.*,
  13.                   bb.DSECOND AS tempcolum
  14.              FROM (
  15.                       SELECT SCORE,
  16.                              DEPAR
  17.                         FROM DEPARSCORE
  18.                   )
  19.                   AS aa
  20.                   LEFT JOIN
  21.                   (
  22.                       SELECT MAX(SCORE) AS DSECOND,
  23.                              DEPAR
  24.                         FROM DEPARSCORE
  25.                        GROUP BY depar
  26.                   )
  27.                   AS bb ON aa.SCORE = bb.DSECOND AND
  28.                            aa.DEPAR = bb.DEPAR
  29.        )
  30. WHERE tempcolum IS NULL
  31. GROUP BY DEPAR
  32. ) AS dd ON cc.DEPAR = dd.DEPAR
复制代码


问题1:我写的这个是不是太啰嗦了?能怎么优化吗,结果倒是正确
问题2:我用的DBIx::Class模块,简单的没问题,遇到这种复杂的SQL查询,就不知道怎么转化成它需要的语句了。我看到文档里面有join, sub query之类的例子,跟这个都不太符合,求指点谢谢!


论坛徽章:
0
发表于 2017-11-28 17:26 |显示全部楼层
太复杂的可以自己写SQL语句, DBIx::Class支持自己写SQL

论坛徽章:
0
发表于 2017-11-30 10:20 来自手机 |显示全部楼层
有具体资料吗,我在文档中没找见,Google 关键词不知道怎么写,惭愧

论坛徽章:
0
发表于 2017-11-30 17:00 |显示全部楼层
https://github.com/fayland/findmjob.com/blob/adb67b8c7e5fd7a0f22e41f651fbb5c022407280/lib/FindmJob/Schema/ResultSet/PeopleUrl.pm

你看看这段代码

论坛徽章:
0
发表于 2017-12-16 12:02 |显示全部楼层
回复 4# quanpai

谢谢指点!对这个模块又了解多了些。我最后还是解决了,用了两个sub_query
这是cookbook种的例子
  my $cdrs = $schema->resultset('CD');  my $rs = $cdrs->search({    year => {      '=' => $cdrs->search(        { artist_id => { -ident => 'me.artist_id' } },        { alias => 'sub_query' }      )->get_column('year')->max_rs->as_query,    },  });

论坛徽章:
0
发表于 2017-12-16 12:02 |显示全部楼层
回复 4# quanpai

谢谢指点!对这个模块又了解多了些。我最后还是解决了,用了两个sub_query
这是cookbook种的例子
  my $cdrs = $schema->resultset('CD');  my $rs = $cdrs->search({    year => {      '=' => $cdrs->search(        { artist_id => { -ident => 'me.artist_id' } },        { alias => 'sub_query' }      )->get_column('year')->max_rs->as_query,    },  });
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP