easyDelphi Q&A
+2 تصويتات
93 مشاهدات

كيف يمكنني الفلترة أو البحث داخل خمسة جداول في مسائلة واحدة ؟ مع تجاهل الحروف  باستخدام دالة       

 COLLATE Latin1_general_CI_AI

.

سُئل في تصنيف Delphi بواسطة | 93 مشاهدات
 
ممكن توضح اكثر وتشرح ماذا تود ان تفعل بالضبط حتى نقـترح عليك الطريقة الافضل
يجب التوضيح اكثر
ما هي المسائلة؟ وما هو تجاهل الحروف؟
المسائلة ترجمة كلمة query . كلمة صحيحة
الفكرة هي أني أريد إنشاء محرك بحث يقوم بالبحث عن كلمة داخل بعض الجداول في قاعدة البيانات وإظهار القيمة المرتبطة بها من الجدول الأب في قائمة بدون تكرار ومع تجاهل اختلاف رسم بعض الحروف الفرنسية مثل  ç .. c   e..é  ...

2 إجابة

+1 تصويت

فقط ادمج الجداول في كوري واحد . وهذا الكوري يمكن اعتباره جدول . اعمل له select و where .
كمثال

select * from 
   (
   select t1.f1 as f1, t1.f2 as f2, t2.f1 as f3, t2.f2 as f4 from table1
   ) q
   where q.f3 = 'abc'

الكوري الداخلي يمكن استبداله باي كوري يجمع هذه الجداول الخمسة مع بعض . 

الفكرة ببساطة . اجمعها في كوري واحد ( حسب ما تراه مناسب )  ثم ابحث فيه نتيجه هذا الكوري عن ما تريد
 

تم الرد عليه بواسطة (15,060 نقاط)
بارك الله فيك ، هذه هي المسائلة هل الكتابة صحيحة

SELECT distinct
def.Definition,
f.intitule as fiches,
app.intitule as appilation,
cex.intitule as condex,
cb.intitule as compb

FROM TABEL1  f

INNER JOIN TABEL2 app  ON (f.id_n = app.id_n)

INNER JOIN TABEL3 def ON (f.id_n = def.id_n)

INNER JOIN TABEL4 cex  ON (f.id_n = cex.id_n)

INNER JOIN TABEL5 cb  ON (f.id_n = cb.id_n)
بحيث TABEL1 هو الأب وباقي الجداول أبناء
لا استطيع ان احدد اذا كانت صحيحة ام لا . لاني لا اعرف بنية قاعدة البيانات التي صممتها .
ساضيف اجابة جديدة  حسب ما فهمت من تعليقاتك الجديدة
+2 تصويتات

حسب تعليقاتك على اجاباتي واجابات الاخرين . اعتقد الاجابة ستكون بهذا الشكل :

ملاحظة : كل ما ورد من امثل في هذه الاجابة مبني على افتراض انك تستخدم Sql Server . لكن مهما كانت قاعدة البيانات التي تستخدمها فالطريقة واحدة . قد تختلف صياغة الكوري بعض الشيء البسيط . 

select intitule as found, 'fiches' as Found_In from table1

union

select intitule as found, 'appilation' as Found_In from table2 where intitule = 'abc'

union

select intitule as found, 'Definition' as Found_In from table3 where Definition = 'abc'

union

select intitule as found, 'condex' as Found_In from table4 where intitule = 'abc'

union

select intitule as found, 'compb' as Found_In from table5 where intitule = 'abc'

 

هذا سيعطيك جدول فيه عمودين found و found_id . الحقل الاول هو النص الذي وجده . والثاني هو مكان وجوده ( في اي جدول يعني ) .

استبدل الـ = بـ like حسب ما تريد

 

لكن الفكرة ببساطة . هي البحث في كل جدول على حدا . وجمع النتائج كلها في جدول واحد

 

بقي شيء بخصوص تجاهل الحروف . هذه الحروف تسمى accent charecters . ولها عدة حلول .

 

  • استبدالها في الكوري وقت الطلب . وهذا مجهد ومتعب وشاقة جدا ويتطلب تعديل كل الكوريات ونسيان او خطأ واحدة منها سهل الحدوث وصعب الايجاد . وبالنهاية ستحصل على كوريات مشوه جدا جدا .
select intitule as found, 'fiches' as Found_In from table1
where replace ( intitule , 'É' ,'E' ) = 'abce'
  • ضبط الـ collation في الكوري وقت الطلب . وايضا هذا متعب ويشوه جدا الكوري ونسيان او خطأ واحد منها سهل الحدوث . لكن ليس صعب العثور عليه.
select intitule as found, 'appilation' as Found_In from table2 where intitule = 'abc'
collate SQL_Latin1_General_CP1_CI_AI

  • وهو استبدال الـ collection set من خصائص قاعدة البيانات . وهو اسهل وافضل الحلول . ويتم مرة واحدة فقط . وهذا مختلف حسب قاعدة البيانات التي تستخدمها ( يمكنك البحث عن sql server how to change Collation  set )
تم الرد عليه بواسطة (15,060 نقاط)
عُدل بواسطة
جزاك الله خيرا أستاذنا ، وصلت للمسائلة المطلوبة ونجحت الفكرة باقي فقط فكرة تجاهل الحروف لكن أهم شئ المسائلة نجحت والحمد لله :)
جيد . شوف تجاهل الاحروف . واذا الامور تمام
. يا ريت تختار الاجابة الصحيحة .
حتى الناس تعرف اي اجابة هي الصحيحة
بالنسبة لتجاهل الحروف التعليمة collate SQL_Latin1_General_CP1_CI_AI
لم تنجح معي لأني استخدم  (SGBD-SQLITE)
الـ sqlite لم تشذ عن غيرها .
يخطر في بالي طريقة قد تكون سهلة . وهي اضافة حقل جديد يحتوي على نفس البيانات باحرف مستبدلة اي لا يحتوي على هذه الاحرف الغريبة بل يحتوي على الشكل الانكليزي منها . والبحث يتم على هذا الحقل وليس الاساسي . بالمختصر احتفذ بنسختين من البيانات . بحروف فرنسي وبدون حروف فرنسية . واختر منها للبحث . ان اردت التميز استخدم الحقل الاساسي وان اردت عدم التميز استخدم الحقل الجديد.
بارك الله فيك ، اتبعت نصيحتك ونجحت العملية

select intitule as found, 'fiches' as Found_In from AppelationDetails
where replace(replace(replace(intitule , 'ç' ,'c'), 'é', 'e'),'à','a') LIKE '%macon%'
   وفي أخ عطاني هذي الفونكيشن
function SimpleText(Text: string): string;
const
  OldText: array [1 .. 14] of string = ('à', 'â', 'é', 'è', 'ê', 'ë', 'î', 'ï',
    'ì', 'ô', 'ò', 'ù', 'û', 'ç');
  NewText: array [1 .. 14] of string = ('a', 'a', 'e', 'e', 'e', 'e', 'i', 'i',
    'i', 'o', 'o', 'u', 'u', 'c');
var
  I: Integer;
  s: string;
begin
  s := Text;
  for I := 1 to Length(OldText) do
    s := StringReplace(s, OldText[I], NewText[I], [rfReplaceAll, rfIgnoreCase]);
  Result := s;
end;
هل يمكن انشاء وظيفة بهذا الشكل داخل ال sql
--('à', 'â', 'é', 'è', 'ê', 'ë', 'î', 'ï','ì', 'ô', 'ò', 'ù', 'û', 'ç');
في داخل الـ sqlite وبشكل مباشر . لا يمكن . يمكن بشكل خارجي في الدلفي (مثلا ) اضافة اجراء واستخدامه داخل الـكوري.
او اعتمد الحل الاخر . وضع حقل اضافي عند حفظ البيانات . تستبدل الاحرف وتحفظها في هذا الحقل . وعند البحث ابحث في هذا الحقل بدل من الحقل الاساسي.
اذا اردت تفصيل اكثر عن اضافة اجراء واستخدامه في الكوري . اكتب سؤال مستقل . لا يمكن الاجابة عليه هنا في التعليقات . ( صراحة انا لم اجربها لكن سانقل لك ما قيل في هذا الموضوع مع شرحه ) . ان استطعت تجربتها ساجربها
بارك الله فيك استاذ

اسئلة متعلقة

+3 تصويتات
2 إجابة
سُئل يوليو 12 في تصنيف SQLite بواسطة NADIRE (630 نقاط) | 50 مشاهدات
+1 تصويت
2 إجابة
سُئل أغسطس 24 في تصنيف Delphi بواسطة Yamada Fakir (970 نقاط) | 43 مشاهدات
+2 تصويتات
1 إجابة
+2 تصويتات
1 إجابة
سُئل أغسطس 11 في تصنيف Database بواسطة Amar Gozim (5,760 نقاط) | 75 مشاهدات
+2 تصويتات
2 إجابة
ادعُ اصدقائك في الفايسبوك لمشاركتك

مرحبًا بك إلى EasyDelphi Q&A، حيث يمكنك طرح الأسئلة والحصول على الإجابة عليها من المستخدمين الآخرين.

لا يسمح بطلب او السؤال عن كراك او تفعيل او كسر او فك او اي شيء يخالف اتفاقيات الترخيص  مهما كان السبب ومهما كان البرنامج ونوعه. ولا حتى نشر روابط تحتوي على مثل هذه الاشياء لا في الاسئلة ولا في الاجابات ولا التعليقات . نهائيا

207 سؤال
391 إجابة
682 تعليق
118 مستخدم