ورود

View Full Version : مشکل در طراحی یک دستور SQL



raha_hakhamanesh
یک شنبه 28 آبان 1391, 12:12 عصر
سلام دوستان
من در زمینه SQL کاربر مبتدی هستم اگر امکان دارد لطفا راهنمایی بفرمایید

در فرآیند جستجو در رکوردهای یک جدول تعداد عناصر تطبیق شده مد نظر است یعنی اگر رکوردی به شرح زیر داشته باشیم و در جستجوی عبارتهای xxx و yyy باشیم می خواهیم بدانیم چه تعداد عبارت در هر فیلد جدولمان وجود دارد.
در نهایت علاقه مندیم رموردهای با تکرار بیشتر را order کنیم

مثال
فیلد اول فیلد دوم فیلد سوم
MM xxxx HH yyy zz gggg xxx rrrr yyy xxx www xxx aaaa bbbb

که نتیجه
برای فیلد اول 1 و 0
برای فیلد دوم 2 و 1
برای فیلد سوم 1 و 1
باید باشد

AMIBCT
یک شنبه 28 آبان 1391, 13:48 عصر
کاری که شما دارید انجام می‌دهید بر خلاف اصول نرمال‌سازی است
در هر حالتی محاسبه‌ی چیزی که شما می‌خواهید مستلزم Full Table Scan است
یعنی اینکه برای محاسبه کل اطلاعات باید جستجو شود که در عمل با ذخیره‌ی اطلاعات در یک فایل txt فرقی ندارد

با این حال
راه انجامش رو در این صفحه می‌تونید ببینید
http://stackoverflow.com/questions/7766959/search-count-of-words-within-a-string-using-sql

راه حل بهتر اینه که جدول خودتون رو به دو جدول کوچکتر تقسیم کنید
تا بتونید از قابلیت‌های SQL استفاده کنید و سرعت کار و کارایی شما افزایش پیدا کنه

برای آشنایی با نرمال‌سازی می‌تونید + این مطلب (http://amib.ir/weblog/?p=306) رو در وبلاگ من مطالعه کنید

raha_hakhamanesh
دوشنبه 29 آبان 1391, 00:46 صبح
متشکرم از اینکه حوصله کردید و راهنمایی کردید
اصراری ندارم که روش خودم را استفاده کنم بنابراین لطف خواهید کرد اگر راهکار اصولی تر و در عین حال ساده ارائه بفرمایید
چنانکه ممکن است از متن متوجه شده باشید در این تمرین باید 5 رکوردی که بیشترین کلمات تطابق یافته را دارد را بعنوان خروجی بازگردانیم

راهکار، روش، مثال اگر وجود دارد سپاسگزارم؛ ضمنا مثال ارائه شده قبلی پاسخ داد ولی اگر روش اصولی تری وجود دارد علاقه مند هستم یادبگیرم
متشکر

AMIBCT
دوشنبه 29 آبان 1391, 10:03 صبح
فیلدی که در جدول شما چند مقداری است باید در یک جدول جداگانه ذخیره شود

یک جدول جداگانه درست کنید که سه ستون داشته باشد
یک ستون کلیدی که عددی autoincrement باشد
یک ستون کلید خارجی که به جدول فعلی شما مرتبط شود
و یک ستون که xxx و yyy ها را به صورت تکی ذخیره کند

برای مثال اگر در حالت فعلی داشته باشید:

1 --------- xxxx yyyy zzzz wwww

ستون دوم رو که چند مقدار رو در خودش ذخیره کرده در جدول دوم ذخیره می‌کنیم

کلید ---- کلید خارجی ---- مقدار
1 -------- 1 -------- xxxx
2 -------- 1 -------- yyyy
3 -------- 1 -------- zzzz
4 -------- 1 -------- wwww

حالا با JOIN و COUNT می‌شه تعداد رو به راحتی پیدا کرد
البته لازمه که روی «کلید خارجی» و در صورت لزوم روی «مقدار» یک «index» قرار بدید که جستجو سریع باشه

raha_hakhamanesh
دوشنبه 29 آبان 1391, 20:01 عصر
دوست عزیز و بزرگوارم سلام
بینهایت سپاسگزارم که با حوصله توضیحات با ارزشی را ارائه فرمودید.
بنده را ببخشید چونکه فکر می کنم با توضیح بدی که نوشتم وقت ارزشمند شما را به هدر دادم. متاسفانه منظور من از عبارت xxx yyy zzz یک متن بود که دنبال کلمه xxx و yyy هستیم. عذرخواهی می کنم

مجدد:
ما تعدادی خبر را از چند خبرگزاری دریافت کردیم فیلد اول نام خبرگزاری، فیلد دوم عنوان خبر و فیلد سوم متن خبر است (برای سادگی بقیه موارد را در نظر نمی گیریم). حال قصد داریم نتیجه بدین شرح باشد که اگر کاربر یا دو یا چند کلمه را جستجو کرد اولا همه فیلدهای شامل آن کلمات کلیدی نمایش انتخاب شوند (که Select Like) است و انجام شده،
دوم آن رکوردهایی که کلمات کلیدی در تیتر خبر هستند در اولویت می باشند
و بالاخره سوم آنکه برای سایر رکوردها که کلمات کلیدی در متنشان است، به ترتیب تعداد کلمات جستجو شده در اولویت قرار گیرند (در این مورد یعنی اگر متن خبر دو رکورد به ترتیب دارای 8 و 6 کلمه جستجو شده داشت اول آنکه بیشترین تکرار را دارد نمایش داده شود)

پس بطور کلی ما سه اولویت داریم، اول رکوردهای دارای کلمات جستجو شده؛ دوم آنهایی که کلمه جستجو شده در فیلد تیتر است و سوم آن رکوردهایی که بیشترین تکرار کلمه جستجو شده را دارند.

بطور کلی مسئله خیلی سخت نیست ولی پیچیده است و سعی کرده بودم با حذف جزئیات ظاهر ساده ای برای بیان داشته باشد ولی ظاهرا خراب کاری کردم :لبخند:

مجدد تشکر می کنم امیدوارم در این باره فرصت یاری داشته باشید

AMIBCT
سه شنبه 07 آذر 1391, 14:27 عصر
اگر نخواهید درگیر پیچیدگی‌های SQL بشوید راه حل ساده همان پیوندی است که بالاتر معرفی کردم
ولی آن روش برای تعداد رکوردهای بالا جوابگو نیست

برای سایت‌های خبری و حجیم باید از ابزارهای مخصوصی استفاده کنید و حتی کار کردن با SQL نیز به تنهایی مشکل شما را حل نمی‌کند
به این ابزارهای Search Server گفته می‌شود
انجام کار Search Server ها به صورت دستی هم ممکن است که کار سختی است و زمان و انرژی زیادی را از شما خواهد گرفت

اگر حجم کار شما زیاد است چاره‌ای ندارید که یک Search Sever هم در کنار SQL Server نصب کنید و عملیات جستجوی اینچنین را به آن بسپارید

baktash.n81@gmail.com
سه شنبه 07 آذر 1391, 16:44 عصر
سلام

در واقع انجام عمل پیدا کردن تکرار یک کلمه در یک متن بسیار هزینه بر است (حافظه و CPU) ... شما نمی تونید هر وقت یک کاربر جستجو کرد بیاین و بر اساس اون کلمه یا تک تک کلمات یا ترکیب آنها عمل پیدا کردن تعداد تکرار رو انجام بدید ... پس شما باید ترکیبی از دورشی که در بالا اشاره شد رو انجام بدید ... وقتی متن خبر رو می خواین وارد کنید ... اون متن رو پارس می کنید و تک تک کلمات رو جدا می کنید بعد تکرار هر کلمه رو به صورت یه جدول 3 ستونی که دوستمون گفت در SQL ذخیره می کنید ... تا موقع جستجو بتونید از این جدول استفاده کنید ... این روش بسیار ساده ایی است که شما می تونید خودتون بنویسید ... یا از ابزارهایی که احتمالا موجود هست استفاده کنید ... در نهایت الگوریتم های پارس کردن متن و پیدا کردن تکرار ها و ترکیب اونها با هم می تونه بسیار پیچیده بشه ... اگه تحت وب کار می کنید فکر کنم گوگل همچین امکانی رو در اختیارتون می زاره ...