PDA

View Full Version : هوشمند تر ( محدود کردن تر ) کردن نتایج جستجو با اسفاده از دستورات sql ؟



hamedpmc
دوشنبه 04 اردیبهشت 1391, 16:15 عصر
با سلام به همه دوستان برنامه نویس
دوستان من دارم روی یک پروژه بزرگ کار میکنم که بانک بزرگی داره و مشکل من اینه که میخوام دستور جستجو هوشمند تر بشه مثلاً فیلد name که روش جستجو انجام میشه توش دارای چند گروه کلمه کلیدی است و وقتی که من عمل جستجو رو با اسفاده از دستور like توی دستور sql انجام میدم طبق دستور زیر



"%'"+select * from tbIllness where Name like '%" + textbox1.Text"



حالا فیلد name من دارای مثلاً حدود 10 کلمه است این دستور حتی اگه یک حرف رو هم وارد کنیم باز نتیجه میاره من میخوام که حدقل اگه حدود 80٪ اون عبارت رو وارد کردیم نتیجه رو نشون بده نه فقط با یه کاراکتر یعنی هوشمند تر بشه و نتیجه جستجو رو محدود کنه ؟
خودم یه فکری به نظرم رسید که اگه تعداد کاراکترهای وارد شده برای جستجو مساوی مثلاً 80٪ کارکترهای داخل فیلد name (فیلد داخل بانک) بود نتیجه را برگردون ولی متاسفانه نتونستم کدش رو بنویسم
اگه کسی می تونه این حرف رو به کد تبدیل کنه دریغ نکنه ؟

لطفاً در مورد این قضیه کمکم کنید چون دیگه واقعاً نمیدونم چکار کنم و دیگه وقتی زیادی برای تحویل پروژه نمونده
ازتون ممنون می شم اگه کمکم کنید ؟
منتظر جوابتون هستم ؟
با تشکر .

barnamenevisforme
دوشنبه 04 اردیبهشت 1391, 16:31 عصر
سلام
یه راهش اینه که قبل از نشون دادن نتیجه،رشته های بازگشتی رو با عبارت وارد شده مقایسه کنید.اگه شرط مورد نظرتون برقرار بود اونوقت نتایج انطباق یافته رو نشون بدین.

masoudmok
دوشنبه 04 اردیبهشت 1391, 17:02 عصر
سلام
به نظر من کاری که برنامه نویس میگه درست نیست چون بار زیادی واسه سیستم داره .
میتونی تا دو کاراکتر عکس العمل نشون ندی . کوچکترین اسم ها حداقل سه حرفی هستن مثل علی . اسم دو حرفی نداریم ! داریم ؟ حالا داشته باشیم هم میشه حل کرد . مثلا اگه بعد از یک حرف یا دو حرف کاربر اینتر زد select به صورت بالا ( همونی که خودت نوشتی ) انجام بشه . اینجوری اسم های دو حرفی هم پیدا میشه
یا حتی یه کار قشنگ تر
بیا واسه وارد کردن هر کاراکتر یه زمانی در نظر بگیریم . مثلا 1 ثانیه . با یه تایمر مشخص کن که اگه از وارد کردن آخرین کاراکتر 1.2 ثانیه گذشته select کن .

hamedpmc
دوشنبه 04 اردیبهشت 1391, 18:57 عصر
ممنون دوستان از پاسختون ولی فکر کنم اصلاً نفهمیدید منظور من چیه !
جز جناب barnamenevisforme (http://barnamenevis.org/member.php?242915-barnamenevisforme) که کمی به موضوع نزدیک شدن ولی خوب تبدیله این حرف به کد یه کم سخته !
از اونایی که تسلط بیشتری به این مبحث دارن درخواست کمک میکنم ؟
با تشکر

masoudmok
دوشنبه 04 اردیبهشت 1391, 19:20 عصر
سلام
شما اطلاعات رو با keydown رفرش می کنین دیگه . من میگم تا موقعی که طول textbox به 3 نرسیده کاری انجام نده . نتایج اینجوری دقیق تر میشه .
یا راه دوم که ...

hamedpmc
دوشنبه 04 اردیبهشت 1391, 19:34 عصر
ببین جناب masoudmok (http://barnamenevis.org/member.php?27704-masoudmok) عزیز شما منظور من رو نفهمیدید
منظور من اینکه اگه len (طول رشته) وارد شده در تکست باکس برابر حدوداً 80٪ len فیلد name در پایگاه داده بود نتیجه رو برگردون حالا فهمیدید
نه اینکه تعیین کنیم که طول عبارت توی تکس باکس چند باشه چون مثلاً من توی فیلد name بانک اطلاتی یه رشته ای دارم که نمی دونم اون جند کاراکتره که براش شرط توی تکست باکس بزارم چون طول اون توی رکورد ها متغیره ! امیداورم که گرفته باشید منظور رو
باز هم از دوستان دیگه تقاضای کمک دارم ؟
با تشکر

omid_csh
دوشنبه 04 اردیبهشت 1391, 23:31 عصر
سلام
اگه منظورتونو درست گرفته باشم:
declare @name nvarchar(50);
set @name = '%ali%';

SELECT [name]
FROM [db].[dbo].[t1]
where name like @name and (LEN(@name)-2) > (LEN(name)*0.8)

masoudmok
سه شنبه 05 اردیبهشت 1391, 08:50 صبح
دقیقا !
منم همینو میگم . ولی صحبت شما باعث بوجود اومدن مشکل میشه .
اگه طول فیلد نام 50 باشه 80 درصدش میشه 40 کاراکتر . اخه کدوم اسم 40 کاراکتریه ؟
حتی اگه منظورت طول بزرگترین نام هم باشه باز مشکل داره . " محمد رضا" 7 کاراکتره . 80 درصدش حداقل میشه 5 کاراکتر . بازم اسم هایی مثل علی سرچ نمیشن .
این select ی که دوستمون نوشته هم همین مشکل رو داره .

omid_csh
سه شنبه 05 اردیبهشت 1391, 10:31 صبح
دقیقا !
منم همینو میگم . ولی صحبت شما باعث بوجود اومدن مشکل میشه .
اگه طول فیلد نام 50 باشه 80 درصدش میشه 40 کاراکتر . اخه کدوم اسم 40 کاراکتریه ؟
حتی اگه منظورت طول بزرگترین نام هم باشه باز مشکل داره . " محمد رضا" 7 کاراکتره . 80 درصدش حداقل میشه 5 کاراکتر . بازم اسم هایی مثل علی سرچ نمیشن .
این select ی که دوستمون نوشته هم همین مشکل رو داره .
سلام
اگه مشکل طول متغیر تعریف شده هستش؟ خب میتونی هر طولی که خودت خواستی بدی.
طبق گفته های خودتون

اگه len (طول رشته) وارد شده در تکست باکس برابر حدوداً 80٪ len فیلد name در پایگاه داده بود نتیجه رو برگردون
طول متنی که وارد میکنید باید بیش از 80 درصد طول نامهایی باشه که داخل جدول وجود داره. اگه اینجوریه که این کوئری همین کارو میکنه.

masoudmok
سه شنبه 05 اردیبهشت 1391, 10:58 صبح
نقل قول دومو من نگفتم . من میگم فرض اشتباهیه .

طول متنی که وارد میکنید باید بیش از 80 درصد طول نامهایی باشه که داخل جدول وجود داره. اگه اینجوریه که این کوئری همین کارو میکنه.
خیلی سادس دیگه . این کار اشتباهه ! حرف من اینه . اگه قرار باشه با طول همه ی نام ها توی جدول مقایسه بشه میتونیم یه کار دیگه بکنیم .
با طول کوچکترین نام مقایسه کنیم .
کوچکترین نام ها هم سه حرفه . 80 درصدش میشه دو حرف . عرض من هم این بود که تا دو حرف توی ورودی کاری انجام ندیم .
اگه شد سه حرف با توجه به اون سه حرف select بگیریم . این میشه یه select بدون شرط های پیچیده و جواب طولانی . البته به نسبت حالت معمولی .

hamedpmc
چهارشنبه 06 اردیبهشت 1391, 11:16 صبح
سلام
اگه منظورتونو درست گرفته باشم:
declare @name nvarchar(50);
set @name = '%ali%';

SELECT [name]
FROM [db].[dbo].[t1]
where name like @name and (LEN(@name)-2) > (LEN(name)*0.8)

اگه میشه دوست عزیز یه سورس بذار ؟
دوستان دیگه هم اگه می تونند کمک کنند دریغ نکنند ؟

omid_csh
چهارشنبه 06 اردیبهشت 1391, 12:28 عصر
اگه میشه دوست عزیز یه سورس بذار ؟
دوستان دیگه هم اگه می تونند کمک کنند دریغ نکنند ؟
سلام
string connection = string.Empty;
connection = @"Data Source=(local);Initial Catalog=db;Integrated Security=True";

using (SqlConnection conn = new SqlConnection(connection))
{
SqlCommand cmd = null;
SqlDataAdapter da = null;
DataSet ds = null;
string query = string.Empty;

query = "SELECT [name] FROM [dbo].[t1]" +
"WHERE name LIKE @name AND (LEN(@name)-2) > (LEN(name)*0.8)";

cmd = new SqlCommand();
cmd.CommandText = query;
cmd.Connection = conn;

cmd.Parameters.AddWithValue("@name", string.Format("%{0}%", "امید"));

da = new SqlDataAdapter();
da.SelectCommand = cmd;

ds = new DataSet();
da.Fill(ds);
}

علیرضا حسن زاده
چهارشنبه 06 اردیبهشت 1391, 14:47 عصر
بهتره تو بخش T-SQL مطرح کنید احتمالا نتایج بهتری هم میگیرید زیاد به #C ربط نداره (البته میشه با کد نویسی هم کارهایی کرد ولی اگه با خود دستورا SQL انجام بشه کاراییش بهتره)

hamedpmc
چهارشنبه 06 اردیبهشت 1391, 22:08 عصر
سلام
string connection = string.Empty;
connection = @"Data Source=(local);Initial Catalog=db;Integrated Security=True";

using (SqlConnection conn = new SqlConnection(connection))
{
SqlCommand cmd = null;
SqlDataAdapter da = null;
DataSet ds = null;
string query = string.Empty;

query = "SELECT [name] FROM [dbo].[t1]" +
"WHERE name LIKE @name AND (LEN(@name)-2) > (LEN(name)*0.8)";

cmd = new SqlCommand();
cmd.CommandText = query;
cmd.Connection = conn;

cmd.Parameters.AddWithValue("@name", string.Format("%{0}%", "امید"));

da = new SqlDataAdapter();
da.SelectCommand = cmd;

ds = new DataSet();
da.Fill(ds);
}


با تشکر از پاسخ همه ی دوستان عزیز
اگه میشه دوست عزیز جناب "omid_csh" کد جستجوی من که به صورت زیر هستش


SqlConnection my_cn = new SqlConnection("Data Source=pc;Initial Catalog=bank Illness;Integrated Security=True");

SqlCommand cmd = new SqlCommand("select * from tbIllness where Name like N'%" + chek + textbox1.Text.ToString() + "%'", my_cn);


if (textbox1.Text != "")
{

SqlDataReader myreader = cmd.ExecuteReader();

if (myreader.HasRows)
{

while (myreader.Read())
{

textBox2.Text = myreader.GetString(2);

}

myreader.Close();

my_cn.close();

و نتونستم طبق سورس شما تغییرش بدم اگه لطف کنید این سورس رو روش جستجوش رو تغییر بدید ممنون می شم ؟

با تشکر

omid_csh
چهارشنبه 06 اردیبهشت 1391, 22:23 عصر
سلام
string connection = string.Empty;
connection = "Data Source=pc;Initial Catalog=bankIllness;Integrated Security=True";

using (SqlConnection conn = new SqlConnection(connection))
{
SqlCommand cmd = null;
SqlDataAdapter da = null;
DataSet ds = null;
string query = string.Empty;

query = "select * from tbIllness" +
"WHERE Name LIKE @name AND (LEN(@name)-2) > (LEN(Name)*0.8)";

cmd = new SqlCommand();
cmd.CommandText = query;
cmd.Connection = conn;

cmd.Parameters.AddWithValue("@name", string.Format("%{0}%", textbox1.Text));

if (textbox1.Text != "")
{
SqlDataReader myreader = cmd.ExecuteReader();

if (myreader.HasRows)
{
while (myreader.Read())
{
// ???
//اینجا فقط آخرین مقدار رو نشون میده
textBox2.Text = myreader.GetString(2);
}

myreader.Close();
conn.Close();
}
}

}

hamedpmc
پنج شنبه 07 اردیبهشت 1391, 11:41 صبح
سلام دوست عزیز
موقعی که سرچ میکنم این Error رو میده لطفاً‌کمک کنید ؟

86323

با تشکر

barnamenevisforme
جمعه 08 اردیبهشت 1391, 15:12 عصر
سلام دوباره
دوست عزیز،با این که روشی که میگم راه حل بهترین نیست ولی امیدوارم گره از کار شما باز کنه.
فرض کنید در رویداد textchange بعد از تغییر یک حرف، یک دستور query اجرا کنیم و نتیجه در غالب یک dataset به ما برگردانده شده باشد.حال تک تک نتایج موجود در ستون مربوطه را برای هر سطر چک میکنیم.از این نظر که طول رشته موجود در سطر مورد نظر را گرفته،80 % مقدار آن را محاسبه،و با طول رشته موجود در جعبه متن مقایسه میکنیم.
در صورتی شرط ما برقرار نباشد،آن سطر را از dataset حذف میکنیم.
در مورد موضوعی که دوستمون گفتن
بار زیادی واسه سیستم داره .

چون به هر حال در زمانی که کاربر متنی رو وارد میکنه ما نمیتونیم یقینا بگیم که کلمات موجود در پایگاه داده از چند کاراکتر تشکیل شده،اجرا دستور query لازم به نظر میرسه(هر چند که پایگاه داده در سیستمی دور واقع شده باشه)اما در مورد بقیه الگوریتم،چون همه اونا در سیستم محلی اجرا میشه،به نظر نمیرسه که وقت چندانی رو از cpu بگیره.
با همه این تفاسیر راه های خیلی بهتری هم میتونه وجود داشته باشه خصوصا از طریق دستورات خود sql