Это действительно не вопрос Perl, а вопрос SQL. В любом случае вам не нужен столбец COUNT
, поскольку SQLite предоставляет встроенную функцию count
для подсчета:
SELECT str, countr(str) FROM mytable GROUP BY str
должен дать вам каждый уникальный str
и количество раз, которое он появляется в таблице.
Конечно, если вы определили таблицу с str
в качестве первичного ключа, вы не можете вставить несколько str
s по определению , поэтому ваша структура таблицы должна быть утонченный.
UPDATE:
Если бы я сделал это (и я не уверен, что сделал бы это), я бы создал таблицу с автоматически сгенерированным столбцом id
и столбцом для строки. SQLite INTEGER PRIMARY KEY , 64-разрядное целое число будет достаточно для назначения уникального идентификатора каждой вставленной строке.
Тогда я бы использовал приведенный выше запрос для получения частот по строке.
Если вы вставляете через Perl DBI , обязательно выключите AutoCommit
во время вставки и не забудьте зафиксировать в конце (или периодически).
Создание индекса кажется почти обязательным, но это должно быть сделано после все строки находятся в базе данных и перед выполнением любых запросов.
#!/usr/bin/perl
use strict; use warnings;
use DBI;
my $dbh = DBI->connect('dbi:SQLite:counter.db', undef, undef,
{ RaiseError => 1, AutoCommit => 0 },
);
my $sth = $dbh->prepare(q{
INSERT INTO strings (string) VALUES(?)
});
my @strings = qw( 0123456789 9876543210 );
for ( 1 .. 10 ) {
my $val = $strings[0.5 > rand];
$sth->execute($val);
}
$dbh->commit;
my $result = $dbh->selectall_hashref(
q{SELECT string, count(string) FROM strings GROUP BY string},
'string',
);
$dbh->disconnect;
use Data::Dumper;
print Dumper $result;
SQL:
DROP TABLE strings;
CREATE TABLE strings (
id INTEGER PRIMARY KEY,
string char(10)
);
Выход:
$VAR1 = {
'9876543210' => {
'count(string)' => '9',
'string' => '9876543210'
},
'0123456789' => {
'count(string)' => '1',
'string' => '0123456789'
}
};