2012-10-09 36 views
0

我不能改写目前DB模式现在BTW,但是这点到我已经打了这个问题的旁边,所以请忽略表结构:dDBIx ::类查询失败,但是从DBIC_TRACE转储工作

我跑这个数据库查询:

my $rs = $dbx->resultset('Result')->search(
      { 
      'result_hnd'   => 16078055, 
      'seasons.outdoor' => 'venue.outdoors', 
      'seasons.start_date' => { '<=' => 'meet.date_end' }, 
      'seasons.end_date' => { '>=' => 'meet.date_begin' }, 
      }, 
      { 
      'join' => [ 
       { 
       'team' => { 
        'league_teams' => { 
        'league' => 'seasons', 
        }, 
       }, 
       }, 
       { 
       'meet' => 'venue' 
       }, 
      ], 
      '+select' => ['seasons.season_hnd','seasons.name','seasons.start_date','seasons.end_date','meet.date_begin','meet.date_end'], 
      '+as'  => ['season_hnd','season_name','s_start','s_end','m_start','m_end'], 
      columns => ['result_hnd'], 
      group_by => ['seasons.season_hnd'], 
      } 
     ); 

当我运行这个,我没有得到任何结果。随着DBIC_TRACE,我看到生成的SQL为:

SELECT me.result_hnd, seasons.season_hnd, seasons.name, seasons.start_date, seasons.end_date, meet.date_begin, meet.date_end FROM track.result me JOIN track.team team ON team.team_hnd = me.team_hnd LEFT JOIN track.league_team league_teams ON league_teams.team_hnd = team.team_hnd LEFT JOIN track.league league ON league.league_hnd = league_teams.league_hnd LEFT JOIN track.season seasons ON seasons.league_hnd = league.league_hnd OR seasons.league_hnd = league.parent_league_hnd JOIN track.meet meet ON meet.meet_hnd = me.meet_hnd JOIN track.venue venue ON venue.venue_hnd = meet.venue_hnd WHERE ((result_hnd = ? AND seasons.end_date >= ? AND seasons.outdoor = ? AND seasons.start_date <= ?)) GROUP BY seasons.season_hnd: '16078055', 'meet.date_begin', 'venue.outdoors', 'meet.date_end' 

当我复制及本声明贴到我的MySQL客户端(和内插的占位符),像这样:

SELECT me.result_hnd, seasons.season_hnd, seasons.name, seasons.start_date, seasons.end_date, meet.date_begin, meet.date_end 
    FROM track.result me 
     JOIN track.team team ON team.team_hnd = me.team_hnd 
     LEFT JOIN track.league_team league_teams ON league_teams.team_hnd = team.team_hnd 
     LEFT JOIN track.league league ON league.league_hnd = league_teams.league_hnd 
     LEFT JOIN track.season seasons ON seasons.league_hnd = league.league_hnd OR seasons.league_hnd = league.parent_league_hnd 
     JOIN track.meet meet ON meet.meet_hnd = me.meet_hnd 
     JOIN track.venue venue ON venue.venue_hnd = meet.venue_hnd 
WHERE ((result_hnd = 16078055 AND seasons.end_date >= meet.date_begin AND seasons.outdoor = venue.outdoors AND seasons.start_date <= meet.date_end)) 
    GROUP BY season_hnd; 

我得到确切我期望的结果(7条记录)。

这真是奇怪。对于所有意图和目的,是不是完全相同的查询?我在调试时错过了什么?或者在没有被转储的DBIx :: Class :: ResultSet层发生其他事情?

回答

1

对于所有意图和目的,是不是完全相同的查询?

所有意图和目的,...)

号在日志中,你必须

result_hnd = '16078055' 
AND seasons.end_date >= 'meet.date_begin' 
AND seasons.outdoor = 'venue.outdoors' 
AND seasons.start_date <= 'meet.date_end' 

也许

result_hnd = 16078055 
AND seasons.end_date >= 'meet.date_begin' 
AND seasons.outdoor = 'venue.outdoors' 
AND seasons.start_date <= 'meet.date_end' 

等价的东西在您的尝试中,您使用了

result_hnd = 16078055 
AND seasons.end_date >= meet.date_begin 
AND seasons.outdoor = venue.outdoors 
AND seasons.start_date <= meet.date_end 

对不起,我没有为您解决的问题。

+0

但DBIx插在了table.field属性按预期进行查询。这不是在搜索的查询部分正确的ssyntax吗? – cliveholloway

+0

忽略上面的注释 - 它只在关系定义中做到这一点,而不是查询。 – cliveholloway

4

告诉SQL ::摘要是右边的值实际上是一个标识符,你可以做以下的(如docs概述):

{ 
    'result_hnd'   => 16078055, 
    'seasons.outdoor' => { -ident => 'venue.outdoors' }, 
    'seasons.start_date' => { '<=' => { -ident => 'meet.date_end' } }, 
    'seasons.end_date' => { '>=' => { -ident => 'meet.date_begin' } }, 
    }, 
+0

完美 - 就是这样。谢谢。陡峭的学习曲线... – cliveholloway

+0

@cliveholloway - 心灵接受答案如果是解决方案? –