繁体   English   中英

在一个查询中从DBIx :: Class :: ResultSetColumn获取SQL MIN()和MAX()

[英]Getting SQL MIN() and MAX() from DBIx::Class::ResultSetColumn in one query

我想从表中选择列的MIN()MAX() 但是,我不想只查询一次数据库,而不是查询两次数据库。

我知道我能做到

my $col = $schema->result_source("Birthday")->get_column("birthdate");
my $min = $col->min();
my $max = $col->max();

但是它将查询数据库两次。

我发现的唯一其他解决方案是非常丑陋的,方法是将selectas属性作为search() 例如

my $res = $rs->search({}, {
   select => [ {min => "birthdate"}, {max => "birthdate"},
   as     => [qw/minBirthdate maxBirthdate/]
});
say $res->get_column("minBirthdate")->first() . " - " . $res->get_column("maxBirthdate")->first();

哪个产生这个-我想要的SQL

SELECT MIN(birthdate), MAX(birthdate) FROM birthdays;

还有什么更优雅的方法可以通过DBIx::Class完成此工作吗?

为了使其更加凉爽,是否有办法尊重色谱柱的充气/放气?

您可以使用作为快捷方式选择作为属性这样组合:

my $res = $rs->search(undef, {
    columns => [
        { minBirthdate => { min => "birthdate" } },
        { maxBirthdate => { max => "birthdate" } },
    ]
});

或者,如果您希望对SQL进行更多控制,请使用字符串引用,这可以帮助进行更复杂的计算:

 my $res = $rs->search(undef, {
    columns => [
        { minBirthdate => \"MIN(birthdate)" },
        { maxBirthdate => \"MAX(birthdate)" },
    ]
});

现在,如果您真的想对其进行清理,我强烈建议您使用DBIx :: Class :: Helpers ,它可以这样编写:

my $minmax = $rs->columns([
    {minBirthdate=>\"MIN(birthdate)"},
    {maxBirthdate=>\"MAX(birthdate)"},
])->hri->single;
say "$minmax->{minBirthdate} - $minmax->{maxBirthdate}";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM