我搜索了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 的迭代次數更少。也許有人可以分析這段程式碼,並讓我們知道這些方法是否有顯著的速度差異。