كيف يمكنني إجراء واحد بسيط-بيان SQL البحث عبر الجداول ؟

StackOverflow https://stackoverflow.com/questions/56334

  •  09-06-2019
  •  | 
  •  

سؤال

لنفترض أن اثنين من الجداول موجودة: users و groups.

كيف توفر "البحث البسيط" الذي يدخل المستخدم النص و النتائج التي تحتوي على كل المستخدمين والمجموعات التي تحتوي أسماؤها على النص ؟

نتيجة البحث يجب أن نميز بين نوعين.

هل كانت مفيدة؟

المحلول

الحيلة هي أن الجمع بين UNION مع سلسلة حرفية لتحديد نوع 'الكائن' عاد.في معظم (?) الحالات ، UNION ALL سوف تكون أكثر كفاءة ، وينبغي أن تستخدم إلا إذا التكرارات المطلوبة في استعلامات فرعية.النمط التالي ينبغي أن يكون كافيا:

 SELECT "group" type, name
   FROM groups
  WHERE name LIKE "%$text%"
UNION ALL
 SELECT "user" type, name
   FROM users
  WHERE name LIKE "%$text%"

ملاحظة:لقد تم إضافة الإجابة من نفسي لأنني صادفت هذه المشكلة أمس ، لم تجد حلا جيدا و تستخدم هذه الطريقة.إذا كان شخص ما لديه نهج أفضل ، من فضلك لا تتردد في إضافته.

نصائح أخرى

إذا كنت تستخدم "الاتحاد جميع" ثم db لا تحاول إزالة التكرارات - لن يكون التكرارات بين اثنين من الاستفسارات على أي حال (منذ أول عمود مختلفة) ، UNION ALL سوف يكون أسرع.
(أفترض أنك لا تملك التكرارات داخل كل الاستعلام الذي تريد إزالته)

باستخدام مثل يسبب عدد من المشاكل كما أنها سوف تتطلب مسح الطاولة في كل مرة عندما مثل المقارنة يبدأ %.هذه القوات SQL للتأكد من كل صف والعمل هو الطريق ، byte by byte, من خلال سلسلة كنت تستخدم للمقارنة.في حين أن هذا قد يكون على ما يرام عندما تبدأ بسرعة يسبب زيادة القضايا.

أفضل طريقة للتعامل مع ذلك هي باستخدام بحث النص الكامل.في حين أن هذا سيكون أكثر تعقيدا الخيار ، وسوف توفر لك مع نتائج أفضل جدا من قواعد البيانات الكبيرة.ثم يمكنك استخدام نسخة عاملة من المثال بوبي جاك أعطى لك UNION ALL لديك اثنين من مجموعات النتائج معا وعرض النتائج.

أود أن أقترح آخر بالإضافة

 SELECT "group" type, name
   FROM groups
  WHERE UPPER(name) LIKE UPPER("%$text%")
UNION ALL
 SELECT "user" type, name
   FROM users
  WHERE UPPER(name) LIKE UPPER("%$text%")

هل يمكن تحويل مبلغ النص إلى الأحرف الأولى أو مجرد القيام في الاستعلام.وبهذه الطريقة يمكنك الحصول على قضية حساسة البحث.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top