मैं वर्तमान में इस कोड का उपयोग एकाधिक स्तंभों के खिलाफ खोज एक खोज के क्षेत्र है बनाने के लिए कैसे:एक बहु स्तंभ mysql की प्रतिलिपि प्राप्त खोज जहां आंशिक शब्दों का मिलान किया जाता है
$searchArray = explode(" ", $searchVal);
$query="SELECT * FROM users WHERE ";
$i=0;
foreach ($searchArray as $word) {
if ($i != 0) $query .= " OR ";
$query .= " MATCH (`first_name`, `last_name`, `email`) AGAINST ('".$word."*' IN BOOLEAN MODE)";
$i++;
}
चलें कहते हैं कि मैं तालिका में इन दोनों पंक्तियों है:
id | last_name | first_name | email
1 | Smith | John | [email protected]
2 | Smith | Bob | [email protected]
यदि मैं "जॉन एस" टाइप करता हूं, तो केवल पहला परिणाम दिखाता है कि वांछित व्यवहार कौन सा है।
यदि मैं "जॉन स्मिथ" टाइप करता हूं, तो केवल पहला परिणाम दिखाता है कि वांछित व्यवहार कौन सा है।
यदि मैं "स्मिथ जे" टाइप करता हूं, तो दोनों परिणाम दिखाते हैं कि बॉब एक मैच नहीं है।
यदि मैं "स्मिथ जॉन" टाइप करता हूं, तो दोनों परिणाम दिखाते हैं कि बॉब एक मैच नहीं है।
आखिरकार, यदि मैं "जो एस" टाइप करता हूं, तो "जो" और "एस" पर आंशिक मिलान के बावजूद कोई परिणाम नहीं लौटाया जाता है।
कोई भी मेरी क्वेरी को वांछित कार्यक्षमता से निपटने में मदद कर सकता है जो महत्वपूर्ण और आंशिक परिणाम मेल नहीं खाता है? यदि इसे सर्वोत्तम मैचों द्वारा क्रमबद्ध किया जा सकता है (यानी शब्द का सबसे लंबा हिस्सा, पहले अक्षर से शुरू होता है, केवल बीच में एक वर्ग नहीं, कॉलम की उच्चतम संख्या में), यह भी एक बड़ी मदद होगी।
अद्यतन:
बस अंतिम कोड है कि समाधान के आधार पर काम पोस्ट करने के लिए करना चाहता था। मेरा लूप एकाधिक मिलान कथन बना रहा था क्योंकि यह मेरा ft_min_word_len था।
मेरे कोड है:
$searchArray = explode(" ", $searchVal);
$query="SELECT * FROM users WHERE MATCH (`first_name`, `last_name`, `email`) AGAINST ('";
$i=0;
foreach ($searchArray as $word) {
$query .= "+".$word."* ";
}
$query .= "' IN BOOLEAN MODE)";
हालांकि अभी भी शर्तों के क्रम के साथ एक मुद्दा प्रतीत होता है। मैंने परीक्षण के लिए लंबा नाम प्राप्त करने के लिए पाब्लो पिकासो को डीबी में जोड़ा।"पाब्लो पिका" शब्द का परिणाम मिलता है। "पिका पाब्लो" नहीं करता है। क्या मुझे एक + और ए * के साथ एक एकल MATCH कथन में शर्तों का पूरा सेट पारित करना चाहिए या जैसा कि मैंने ऊपर दिया है या एक से अधिक MATCH स्टेटमेंट कर रहा हूं? – Max
@ मैक्स: मैं इसे 'पिका पाब्लो' दोनों 'पाब्लो पिका' (या '+ पिका * + पाब्लो *'/'+ पाब्लो * + पिका *') के रूप में पुन: पेश नहीं कर सकता, मेरे लिए एक ही उपयोगकर्ता को वापस कर सकता हूं। हां, एक ही 'MATCH() के खिलाफ() 'कथन। 'MATCH()' में प्रत्येक एकल शब्द को 'टर्म * * प्रारूप की आवश्यकता होगी। हालांकि @ पैट्रिकबी की टिप्पणी पढ़ें: नाम <4 वर्ण कभी मेल नहीं खाएंगे। – Wrikken
धन्यवाद! Ft_min_word_len का संयोजन और इसे एक एकल MATCH कथन में बदलकर इसे ठीक किया गया। मैं अपने अंतिम कोड के साथ सवाल अपडेट कर दूंगा। – Max