كيف يمكنني إجراء واحد بسيط-بيان SQL البحث عبر الجداول ؟
سؤال
لنفترض أن اثنين من الجداول موجودة: 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%")
هل يمكن تحويل مبلغ النص إلى الأحرف الأولى أو مجرد القيام في الاستعلام.وبهذه الطريقة يمكنك الحصول على قضية حساسة البحث.