PDA

View Full Version : تحلیل و محدود کردن جواب ها در این نوع از پایگاه



masih_enter
شنبه 09 مهر 1390, 16:17 عصر
سلام دوستان
من یک پایگاه دارم که با خروجی گرفتن از اون مشکل دارم
کلا درک درستی از خروجی گرفتن از این نوع پایگاه داده ندارم
مثلا میخوام بدونم آیا امکان داره تو یک دستور sql بشه کاربری که اسمش علی است و شماره تماسش 0935 و همچنین دسترسیش مدیر هست رو تو خروجی نمایش بدم یا نه؟
من الان برای اینکار یک دور باید کسایی که اسمشون علی است رو استخراج کنم و در مرحله بعد یک کانکشن دیگه بسازم و از این لیست تک تک بخونم و اون های که شمارشون 0935 هست رو وردارم و از لیست جدید دوباره یک کانکشن بسازم و تک تک بخونم و اون هایی که دسترسیشون مدیر است رو خارج کنم
حالا وقتی شرط ها تعدادشون زیاد میشه واقعا این مسئله کند عمل میکنه و دیر انجام میشه
متاسقانه برنامه پیاده سازی شده و نمیشه قالب پایگاه رو تقییر داد
http://up2.iranblog.com/images/uds0r20k61tugfqtl04.jpg

mehran_sh_t
شنبه 09 مهر 1390, 16:35 عصر
سلام
قالب کد جستجوتون رو تغییر بدید. فرض کنید تو هر مرحله، یک فیلد و یک مقدار می گیری و جستجو رو بر اساس اون انجام میدی.
حالا برای هر کدوم یک آرایه در نظر بگیر، به ازای هر خونه از آرایه، یک Where در دستور بذار
موفق باشی

masih_enter
شنبه 09 مهر 1390, 16:42 عصر
سلام متاسفانه شناخت من از sql کافی نیست.امکانش هست با یک مثال ساده توضیح بدید که چطور انجامش بدم ؟
در حال حاضر کارم راه افتاده ولی میخوام راه های اصولی و صحیح تر رو هم یاد بگیرم.یا بقولی بهینه سازی شده تر

mojtaba.baghban
شنبه 09 مهر 1390, 16:55 عصر
کویری باید چیزی شبیه این باشد
select * from tableName
where نام='علی' and موبایل='0935' and دسترسی='مدیر'

masih_enter
شنبه 09 مهر 1390, 18:41 عصر
نه متاسفانه این روش جوابگو نیست
چون دسترسی یا موبایل یا نام خودشون یک ستون نیستند که بشه گفت اگر دسترسی مساوی با این مقدار بود
خود دسترسی یک فیلد است
من در حال حاضر اینطوری جستجو میکنم برای پیدا کردن یک مورد
مثلا میخوام بدونم کیا شماره تلفنشون 0935 است میزنم :




Select ID From Tabel1
Where Sefat = 'Mobile' AND Meghdar='0935'

حالامشکل اینه اگر این کد تا اینجاش اجرا بشه باقی صفت ها از لیست خارج میشن و نمیشه یک شرط دیگه گذاشت و گفت :
و نام آن علی باشد

mojtaba.baghban
شنبه 09 مهر 1390, 19:12 عصر
به نظر من ساختار جدول رو باید تغییر بدین بعد با استفاده از insert into ... select جدول جدید را با داده های جدول قدیم پر کنید

mehran_sh_t
شنبه 09 مهر 1390, 19:39 عصر
به ساختار جدولتون توجه نکردم. جدولتون اشتباهه. ستون ها باید به این شکل باشن:
ِID, Name, Mobile, Email, Dastresi و ...
اگر هم بر این ساختار خودتون اصرار دارید، این روش سرچ رو در کد برنامه باید پیاده کنید، نه در SQL (تا جایی که من بلدم)
ولی به نظرم حتما ساختار رو تغییر بدید.

یوسف زالی
شنبه 09 مهر 1390, 19:43 عصر
سلام.
این روش درستی برای ذخیره داده ها نیست.
بهتره که به جای این روش تمام خصوصیات رو تبدیل به ستونهای یک جدول کنید.
اما حالا بد نیست که روش گرفتن کوئری از این جور جداول رو هم بررسی کنیم.
یک راهش اینه که سه تا سلکت مختلف رو بگیریم:

Select * from TBL where ID in
(
(select ID as IDA from TBL where Sefat = 'name' and meghdar = 'ali') A
join
(select ID as IDB from TBL where Sefat = 'mobile' and meghdar = '935') B
on A.IDA = B.IDB
join
(select ID as IDC from TBL where Sefat = 'dastresi' and meghdar = 'modir') C
on A.IDA = C.IDC
)


این یک روششه.
روشهای دیگه ای هم هست که اگر واقعا نیاز باشه توضیح می دم.
موفق باشید.

masih_enter
شنبه 09 مهر 1390, 20:43 عصر
این جدول در برنامه nttac plus استفاده شده که معروف ترین برنامه اکانتینگ تحت ویندوز است
دلیل اینکه چرا موقع طراحی از این مدل نوشتن استفاده کردن را واقعا نمیدانم.شاید اینطوری بشه داده های خاصی را سریع تر خواند و به اتصال کاربران در هنگام اعتبار سنجی سرعت بخشید. البته شاید
من برای این سیستم یک پنل تحت وب طراحی کردم که تو بخش جستجو های چند شرطه به این مشکل بر خوردم.
خوبیش اینه واقعا از طراحیش لذت میبرم چون با خیلی از مسائل که بلد نودم آشنا شدم و یک پروژه آموزشی عالی برای من بود
این کد های دوستمون رو امشب تست میگیرم و نتیجه را حتما اعلام میکنم که اگر دوستان دیگری هم به این مشکل بر خوردن با یک راهکار عملی و تست شده مواجه بشن

masih_enter
یک شنبه 10 مهر 1390, 01:00 صبح
من هرکاری میکنم نمیشه متاسفانه
این سه حرفA , B , C رو خطا میگیره تو managment stadio که میخوام تست کنم ببینم خروجی چی در میاد



Select * from TBL where ID in
(
(select ID as IDA from TBL where Sefat = 'name' and meghdar = 'ali') A
join
(select ID as IDB from TBL where Sefat = 'mobile' and meghdar = '935') B
on A.IDA = B.IDB
join
(select ID as IDC from TBL where Sefat = 'dastresi' and meghdar = 'modir') C
on A.IDA = C.IDC
)

یوسف زالی
یک شنبه 10 مهر 1390, 08:07 صبح
قبلش as بگذار

masih_enter
یک شنبه 10 مهر 1390, 11:09 صبح
سلام قبلش هم as گذاشتم ولی حالا به سه تا as گیر میده تو وریفای کردن کد
من از sql 2005 استفاده میکنم البته فکر نمیکنم مشکل از ورژن باشه
خودم هم دارم تو سایت ها میگردم و همینطور باهاش کار میکنم تا آخرش به نتیجه برسیم

mehran_sh_t
یک شنبه 10 مهر 1390, 11:29 صبح
دو طرف Query های میانی پرانتز بذارید، شاید درس شه.
مثلا

(SELECT .... AS A) JOIN (SELECT ... AS B)

masih_enter
یک شنبه 10 مهر 1390, 11:47 صبح
متاسفانه این هم نشد
البته وقتی AS A رو بعد از TBL و قبل از دستور Where میزارم دیگه به As یا A گیر نمیده ولی به join و on حالا گیر میده

یوسف زالی
یک شنبه 10 مهر 1390, 20:24 عصر
رو می آریم به روش دوم:

Select * from TBL where ID in

(select ID as IDA from TBL where Sefat = 'name' and meghdar = 'ali')
and ID in
(select ID as IDB from TBL where Sefat = 'mobile' and meghdar = '935')
and ID in
(select ID as IDC from TBL where Sefat = 'dastresi' and meghdar = 'modir')

masih_enter
یک شنبه 10 مهر 1390, 21:12 عصر
سلام
با تشکر از شما دوست عزیز
این کد که دادید درست کار میکنه

این کد زیر هم همون کد هست و Id افرادی که تو لیست خروجی نمایش داده بشن رو بر اساس ای دی او ها یکی میکنه و میشه براحتی این ای دی ها را به مشخصات دلخواه بازخوانی کرد
البته باید کمی رو کد شما کار کنم تا درست اونو درک کنم و بتونم در پروژه های آینده ازش استفاده کنم
(قابل توجه دوستانی که این تاپیک براشون مرجعی در آینده خواهد شد : این کد و کد بالا در این مورد به درستی جواب داد)



SELECT ID
FROM TBL
WHERE (ID IN
(SELECT ID AS IDA
FROM TBL AS TBL_3
WHERE (Sefat = 'name') AND (meghdar = 'ali'))) AND (ID IN
(SELECT ID AS IDB
FROM TBL AS TBL_2
WHERE (Sefat = 'mobile') AND (meghdar = '935'))) AND (ID IN
(SELECT ID AS IDC
FROM TBL AS TBL_1
WHERE (Sefat = 'dastresi') AND (meghdar = 'modir')))
GROUP BY ID
ORDER BY ID