簡體   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