mysql中的子查询与全文查询
我正在尝试查询数据库。我已经有了一个包含整个数据库中一些主键的文件。现在我想过滤这些主键,只得到那些也符合其他条件的主键。我的主键与数据库中的摘要相关联。摘要是全文索引的。现在我想用给定的主键来考虑摘要,在这些摘要中查找我的其他条件项,如果它存在,我想把它们的主键从文件中拉出来。我的另一个条件是另一个包含术语列表的文件。我想得到在给定主键中包含这些术语的摘要 我的全文搜索是这样的:mysql中的子查询与全文查询,mysql,perl,full-text-search,subquery,Mysql,Perl,Full Text Search,Subquery,我正在尝试查询数据库。我已经有了一个包含整个数据库中一些主键的文件。现在我想过滤这些主键,只得到那些也符合其他条件的主键。我的主键与数据库中的摘要相关联。摘要是全文索引的。现在我想用给定的主键来考虑摘要,在这些摘要中查找我的其他条件项,如果它存在,我想把它们的主键从文件中拉出来。我的另一个条件是另一个包含术语列表的文件。我想得到在给定主键中包含这些术语的摘要 我的全文搜索是这样的: while(<FILE1>){ $PK = $_; foreach $foo(@foo){ my $s
while(<FILE1>){
$PK = $_;
foreach $foo(@foo){
my $sth = $dbh->prepare(qq{
SELECT value
FROM value_table
WHERE MATCH (column_text_indexed) AGAINST (? IN BOOLEAN MODE)
}) AND primary_key=$PK;
$sth->execute(qq{+"$foo"});
}
}
其中$PK来自我已经拥有的主键列表。
$foo将是我正在寻找的条款条件2的列表
通常,我可以运行这个查询$PK的次数乘以$foo的次数。但我通过子查询了解了一些优化方面的知识,在子查询中我不会运行我的查询$PK乘以$foo。这将去掉内部循环,但仍然会形成每个$PK和文件2中每个术语的组合,即@foo。大致如下:
while(<FILE1>){
$PK = $_;
my $sth = $dbh->prepare(qq{
SELECT value
FROM value_table
WHERE MATCH (column_text_indexed) AGAINST (**SUB QUERYING HERE**)
}) AND primary_key=$PK;
$sth->execute(qq{+"$foo"});
}
只是我不知道怎么做。我可能有语法错误。我想知道如何为全文搜索和子查询编写代码。我希望这比直接查询组合更有效。非常感谢您的帮助。您的语法看起来有问题。我想你的意思是:
while(<FILE1>){
$PK = $_;
foreach $foo (@foo){
my $sth = $dbh->prepare(qq{
SELECT value
FROM value_table
WHERE MATCH (column_text_indexed)
AGAINST (**SUB QUERYING HERE**)
AND primary_key=$PK }); # '})' after AND clause
$sth->execute(qq{ $foo });
}
}
我认为您不需要使用子查询。但是您仍然可以通过组合匹配字符串来摆脱内部循环
my $against = join ' ', map {qq/"$_"/} @foo;
while (my $PK = <FILE1>) {
chomp $PK;
my $sth = $dbh->prepare(qq{
SELECT value
FROM value_table
WHERE primary_key = ?
# no '+' so it can match against at least one of the words in the list
AND MATCH (column_text_indexed) AGAINST (? IN BOOLEAN MODE)
});
$sth->execute($PK, $against);
更新
我修改了它,并从循环中完全删除了查询
my @primary_keys;
while (my $PK = <FILE1>) {
chomp $PK;
push @primary_keys, $PK;
}
my $PK_list = join ',', map {qq/'$_'/} @primary_keys;
my $against = join ' ', map {qq/"$_"/} @foo;
my $sth = $dbh->prepare(qq{
SELECT value
FROM value_table
# placeholders can only represent single scalar values so $PK_list can't be bound
WHERE primary_key IN ($PK_list)
# no '+' so it can match against at least one of the words in the list
AND MATCH (column_text_indexed) AGAINST (? IN BOOLEAN MODE)
});
$sth->execute($against);
# continue with fetching the rows
...;
如果您希望提高效率,我建议您使用最少的数据库事务和操作。因此,在这种情况下,我认为最好的选择是从数据库中获取基于主键的摘要,然后通过在pearl或任何其他标准语言代码中执行简单的字符串搜索来搜索该摘要中的术语。我不太清楚你们的条款清单有多长。但如果可能,您可以将其保存在标准数据结构中,如数组或列表。在数据库中执行相同的操作肯定会花费更多的时间。我不太擅长pearl语法,所以我正在编写算法 对于PK中的所有术语,将摘要作为字符串变量获取: 对于数组/列表中的每个术语:在包含抽象的字符串变量中查找术语。如果找到,将PK添加到新文件中 继续下一个pk
如果未找到,则在数组/列表中继续下一学期。感谢您的回复。也许我问错了。基本上我想摆脱第二个循环。我还是想把文件1中的PK和文件2中的每个术语结合起来使用。谢谢你的回复。是的,我想去掉内环。但我真正想要的是文件2中每个$PK和每个术语的组合,即@foo。它会这样做吗?这是否意味着你想重复它匹配的每个术语的记录?最好是测试这段代码,看看它是否完全符合您的要求。嘿,史蒂文,我想第一段代码对我来说是可行的。但我还有一个顾虑$反对不仅仅是一个词,还包括短语。如果你观察我的代码,用qq左右的短语来寻找匹配。我如何在这里实现它?我试着执行$PK,qq{$anther},但似乎不起作用。你知道吗?看看我的调整是否对你有用。我在$PK_列表和$from的每个值周围添加了引号。另外请注意,$PK_list可能不会作为IN子句的绑定值,但如果您需要多次执行此查询,则可能会导致性能损失。这非常有帮助。我尽了最大努力验证代码。我认为它适合我。但我不是计算机科学背景,我不确定您的代码是否符合我的要求。我只是想确认一下。如果我错了,你可以告诉我。我有一个PrimaryKeysFILE1列表,它映射到数据库中的摘要。我有另一个文件和一些术语文件2。现在我只需要那些文件1中的键,它们在摘要中也有来自文件2的术语;唯一链接到FILE1中PrimaryKeys的摘要。因此,我从代码中跳过了内部循环。我想确保我没有遗漏任何内容。
my @primary_keys;
while (my $PK = <FILE1>) {
chomp $PK;
push @primary_keys, $PK;
}
my $PK_list = join ',', map {qq/'$_'/} @primary_keys;
my $against = join ' ', map {qq/"$_"/} @foo;
my $sth = $dbh->prepare(qq{
SELECT value
FROM value_table
# placeholders can only represent single scalar values so $PK_list can't be bound
WHERE primary_key IN ($PK_list)
# no '+' so it can match against at least one of the words in the list
AND MATCH (column_text_indexed) AGAINST (? IN BOOLEAN MODE)
});
$sth->execute($against);
# continue with fetching the rows
...;