Ik kwam dit probleem tegen bij het bouwen van een zoekopdracht op een website met meerdere soorten inhoud (filmdatabase). Ik wilde dat de gebruiker één zoekopdracht kon uitvoeren en de naam van een acteur, film of personage kon vinden.
In plaats van te proberen één grote SQL-instructie te krijgen, heb ik een overeenkomst gemaakt voor elk type inhoud (filmtitel, filmplot, acteurnaam, karakternaam, enz.) en plakte de id van de rij, het type inhoud en de score van de overeenkomst in een multidimensionale array. Normaal gesproken zou ik elk inhoudstype beperken tot de top 50 overeenkomsten.
Ik was toen in staat om de array te sorteren op basis van score. Dan zou ik de id en het inhoudstype gebruiken om de informatie op te zoeken die ik nodig had voor elk resultaat.
BEWERKEN (code toevoegen)
Disclaimer:dit is oude code en er zijn waarschijnlijk efficiëntere manieren om dit te doen
$topResults = array();
$topResults[0] = array('nil', 'nil', 0);
$movieFound = 0;
$plotFound = 0;
$actorFound = 0;
$characterFound = 0;
// example of movie title... follow the same procedure for the others
$sql = "SELECT movies.Movie_ID as mid, MATCH (Movie_Title) AGAINST ('$searchstring') AS Score FROM movies, Rating_Movie_Relationships WHERE MATCH (Movie_Title) AGAINST ('$searchstring') AND Front_Image_File IS NOT NULL AND movies.Movie_ID = Rating_Movie_Relationships.Movie_ID $sqlwhere ORDER BY Score DESC LIMIT 0, 20";
$result = @mysql_query($sql);
while ($row = mysql_fetch_array($result)) {
for ($i = 0; $i < count($topResults);$i++){
if ($row['Score'] > $topResults[$i][2]){
for ($j = count($topResults); $j > $i; $j--){
$topResults[$j] = $topResults[$j-1];
}
$topResults[$i] = array($row['mid'], 'm', $row['Score'] - $movieWeight);
break;
}
}
$movieFound = 1;
}
//.... add the other content types here following the movie title example
for ($i = 0; $i < count($topResults); $i++){
if ($topResults[$i][1] == 'm'){
if ($countMovies < $limit) {
$movieTitleDivText .= str_replace('\'',''',createPersonMovieImageLink($topResults[$i][0]));
$countMovies++;
}
}