اسم mysql مثل '٪ # estributes.q #٪' - لا يعود النتيجة لمباراة دقيقة؟
-
19-09-2019 - |
سؤال
لدي استعلام MySQL التالي:
SELECT *
FROM customer
WHERE
fName LIKE '%#attributes.q#%' AND deleted = 'N'
OR
lName LIKE '%#attributes.q#%' AND deleted = 'N'
يعمل هذا جيدا على التخمينات، ولكن إذا قمت بتوفير تطابق دقيق: "Bill Clinton" fname = Bill Lname = Clinton إلى الاستعلام أعلاه تحصل على 0 نتائج؟ حيث يعطي بيل كلينت النتائج.
كيف يمكن تحديث هذا الاستعلام ليقول إيجاد النتيجة ويساوي النتائج؟
المحلول
من الصعب معرفة سؤالك، لكنني أظن أن جدول عملائك سيبدو شيئا مثل:
id fName lName deleted
---------------------------------
1 John Doe N
2 Bill Clinton N
3 Fred Smith N
4 George Bush Y
استفسارك، كما ذكرت ذلك في سؤالك، لن تعمل أبدا، كما ستبدو مثل هذا:
SELECT *
FROM customer
WHERE fname LIKE '%Bill Clinton%' AND deleted = 'N'
OR
lName LIKE '%Bill Clinton%' AND deleted = 'N'
لا توجد سجلات في الجدول حيث تحتوي حقول FNAME أو LNAME على "Bill Clinton"
سيتعين عليك تدليك النص # # # لذلك، فهذا سيؤدي إلى توليد شيء مثل هذا:
SELECT *
FROM customer
WHERE ((fName LIKE '%Bill%') OR (fName LIKE '%Clinton%')) AND deleted = 'N'
OR
((lName LIKE '%Bill%') etc.....
مثل المقارنات تشبه إلى حد كبير استخدام أحرف البدل في أسماء الملفات. لن يقوموا بتقسيم كتلة من النص لك، ولكنهم سيخبرونك إذا كان جزء من النص موجود، حرفيا، داخل جزء آخر من النص.
أعتقد أن ما تحتاجه هو البحث عن النص الكامل, ، والتي ستنظر في الكلمات الفردية في سلسلة الاستعلام ونتائج العودة. بالطبع، النص الكامل متاح فقط على أنواع جدول MyIISAM، لذلك إذا كنت تستخدم InnoDB أو نوع آخر، فأنت خارج الحظ.
نصائح أخرى
FYI - يمكن استخدام فهارس النص الكامل فقط مع جداول InnoDB أو MyISAM، ويمكن إنشاء أعمدة Char أو Varchar أو Text فقط.