使用 perl dbi 建立列表的哈希值,如“id 的所有標籤”

使用 perl dbi 建立列表的哈希值,如“id 的所有標籤”

我搜索了dbi文檔並用谷歌搜索,但找不到是否有(dbi)本地方法來構建列表的哈希值。我能想到的最接近的是,fetchall_hashref但這會覆蓋結果,只給我最後一對是什麼。為了澄清一下,我的表格是一個諸如“id,標籤”之類的對的列表。我希望按 id 對所有行進行分組並返回一個散列,其中鍵是 id,“值”是(引用)其所有標籤的列表。所以在以下情況:

id1, tag1
id1, tag2
id2, tag3
id2, tag1

我想得到:

{'id1' => ['tag1', 'tag2'],
 'id2' => ['tag3', 'tag1'] }

這可能嗎?如果不是,那麼以非本地方式執行此操作的最佳(最有效)方法是什麼?最明顯的方法是只執行 fetchall_* + Push() 組合,但有更好的方法嗎?

答案1

這是我目前的方法:

my $ret = {};
foreach (@{ $sth->fetchall_arrayref(  ) }) { # returns ref to array
    push  @{ $ret->{ $_->[0] } }, $_->[1] ;
    }
return $ret;

萬一它對那裡的人有用,同時我們等待看看是否有更好的方法來做到這一點。


編輯:

我找到了另一種方法,即GROUP_CONCAT在 MySQL 中使用“標籤”,並與一個唯一的字元連接起來,然後split()在 Perl 中使用它。查詢類似:

SELECT id, GROUP_CONCAT(tag, '|')
FROM mytable
GROUP BY tag

然後在 perl 中:

my $ret = {};
foreach (@{ $sth->fetchall_arrayref(  ) }) { # returns ref to array
    push  @{ $ret->{ $_->[0] } }, split("|", $_->[1]) ;
    }
return $ret;

未經測試的代碼,因此適用標準警告。

我看到的唯一優點是,這從資料庫返回的行數更少,因此 foreach 的迭代次數更少。也許有人可以分析這段程式碼,並讓我們知道這些方法是否有顯著的速度差異。

相關內容