[英]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.