मैं इस मुद्दे पर कई प्रकार की सामग्री (मूवी डेटाबेस) वाली वेबसाइट पर एक खोज का निर्माण कर रहा था। मैं चाहता था कि उपयोगकर्ता एक खोज कर सके और अभिनेता, फिल्म या चरित्र का नाम ढूंढ सके।
एक बड़ा SQL कथन प्राप्त करने का प्रयास करने के बजाय, मैंने प्रत्येक प्रकार की सामग्री (मूवी_टाइटल, मूवी_प्लॉट, अभिनेता_नाम, वर्ण_नाम, आदि) के लिए एक मैच किया और पंक्ति की आईडी, सामग्री का प्रकार और मैच का स्कोर चिपका दिया। एक बहुआयामी सरणी में। मैं आमतौर पर प्रत्येक सामग्री प्रकार को शीर्ष 50 मैचों तक सीमित रखता हूं।
मैं तब स्कोर के आधार पर सरणी को सॉर्ट करने में सक्षम था। फिर मैं प्रत्येक परिणाम के लिए आवश्यक जानकारी देखने के लिए आईडी और सामग्री प्रकार का उपयोग करूंगा।
संपादित करें (कोड जोड़ना)
अस्वीकरण:यह पुराना कोड है, और इसे करने के शायद अधिक कुशल तरीके हैं
$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++;
}
}