kelfro, Propeller develops recommended that:
Code:
$tblAlias = self::getRndTblAlias();
$sql .= 'SELECT DISTINCT '.$tblAlias.'.DocumentId FROM'."\n";
foreach ($tokens as $token) {
$token = mysql_real_escape_string($token);
if ($firstToken) {
$sql .= '(SELECT DocumentId FROM Support_Document_Tag JOIN (SELECT Id FROM Support_Tag WHERE Tag LIKE \''.$token.'\') Tags ON Tags.Id = TagId) '.$tblAlias."\n";
$firtToken = false;
} else {
$tblAliasPrev = $tblAlias;
$tblAlias = self::getRndTblAlias();
$sql .= 'JOIN (SELECT DocumentId FROM Support_Document_Tag JOIN (SELECT Id FROM Support_Tag WHERE Tag LIKE \''.$token.'\') Tags ON Tags.Id = TagId) '.$tblAlias.' ON '.$tblAlias.'.DocumentId = '.$tblAliasPrev . '.DocumentId' . "\n";
}
}
WHERE
Code:
$tblAlias = self::getRndTblAlias();
$sql .= 'SELECT DISTINCT '.$tblAlias.'.DocumentId FROM'."\n";
foreach ($tokens as $token) {
$token = mysql_real_escape_string($token);
if ($firstToken) {
$sql .= '(SELECT DocumentId FROM Support_Document_Tag JOIN (SELECT Id FROM Support_Tag WHERE Tag LIKE \''.$token.'\') Tags ON Tags.Id = TagId) '.$tblAlias."\n";
$firtToken = false;
} else {
$tblAliasPrev = $tblAlias;
$tblAlias = self::getRndTblAlias();
$sql .= 'JOIN (SELECT DocumentId FROM Support_Document_Tag JOIN (SELECT Id FROM Support_Tag WHERE Tag LIKE \''.$token.'\') Tags ON Tags.Id = TagId) '.$tblAlias.' ON '.$tblAlias.'.DocumentId = '.$tblAliasPrev . '.DocumentId' . "\n";
}
}
This unfortunately gives some more joins, but can optimize the code so that the tokens are the fewest documents which have come first, and thereby reduce the number of posters considerably.
In your solution, it is advantageous to change
Code:
HAVING COUNT( d.ID )=3
to
Code:
HAVING COUNT( d.ID ) >= 3
thus one can also use wildcard searches (eg, a search on 'data%' and 'database' fail without'>').
Bookmarks