[英]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();
但是它将查询数据库两次。
我发现的唯一其他解决方案是非常丑陋的,方法是将select
和as
属性作为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.