PDA

View Full Version : ساختن یک query پیچیده!



A_1397
سه شنبه 06 تیر 1391, 13:53 عصر
مدیران عزیز لطفا حذف نکنید آخه در قسمت sql مطرح کردم جواب نگرفتم.
شرح موضوع: 10تا تیبل دارم که با 6تافیلد بهم دیگه مرتبط شده اند. تصویر ارتباط بین جداول رو میزارم:(هر رنگ از فلش ها نشان یک فیلد متفاوت است)
http://barnamenevis.org/attachment.php?attachmentid=88763&d=1340693080
که مسلما هر کدوم از جدول ها شامل چندین فیلد است. حالا مشکل من اینه که نمیتونم با این 10تاجدول و ارتباطاشون queryبسازم که مثلا اگه table1.field1="hello" بیاد و فیلدهای هر10تاجدول رو باتوجه به این شرط برگردونه.:گیج: امیدوارم منظورم رو واضح بیان کرده باشم.

ROSTAM2
سه شنبه 06 تیر 1391, 14:04 عصر
جدول بابا داريم و جدول بچه
مسلما جدولاي بابا فيلد مورد نظر توشون KEY هستش تا بتونيد از اون KEY براي FILTER كردن اطلاعات ساير جدولا استفاده كنيد اينطور نيست؟؟

A_1397
سه شنبه 06 تیر 1391, 14:17 عصر
جدول بابا داريم و جدول بچه
مسلما جدولاي بابا فيلد مورد نظر توشون KEY هستش تا بتونيد از اون KEY براي FILTER كردن اطلاعات ساير جدولا استفاده كنيد اينطور نيست؟؟

خب فیلدآبی در table1 و فیلد مشکی در table2 کلید هستن. ولی بقیه جدول ها فیلد کلیدی ندارند. من واسه ارتباط بین 3 یا 4تا جدول از inner join استفاده میکردم ولی حالا که 10 جدولند گیج شدم :افسرده:

ROSTAM2
سه شنبه 06 تیر 1391, 14:21 عصر
كوئرياتونو بزاريد ببينم

A_1397
سه شنبه 06 تیر 1391, 14:51 عصر
كوئرياتونو بزاريد ببينم

بطور مثال برای جستجو در جدول های T1,T2,T3,T5 با شرط اینکه T1.Field1="hello" از کد زیر استفاده کردم و درست هم جواب میده:

select T1.Abi , T2.Abi, T3.Meshki, T5.field2 , T2.field3 from T1, T3 , T5 inner join T2 on T2.Meshki=T3.meshki where T5.meshki=T3.meshki and T1.Abi=T2.Abi and T1.Field1="Hello"
من که خودم نفهمیدم چی شد!!!:لبخند:

ROSTAM2
سه شنبه 06 تیر 1391, 15:46 عصر
من که خودم نفهمیدم چی شد!!!

بنظرم جدولاتو آپ كني بهتره ، كليدا رو هم ذكر كن بالاخره بي جواب نمي مونه چون فكر نكنم يه كوئري براي ده تا جدول جوابگو باشه

arman_Delta2002
سه شنبه 06 تیر 1391, 16:03 عصر
فکر کنم منظورش این باشه که یه حرف رو مثلا احمد رو تو تمام تیبل ها سرچ کنه


select * from table1 where match(col1, col2, col3) against ('some string')
union all
select * from table2 where match(col1, col2) against ('some string')
union all
select * from table3 where match(col1, col2, col3, col4) against ('some string')

A_1397
سه شنبه 06 تیر 1391, 17:03 عصر
فکر کنم منظورش این باشه که یه حرف رو مثلا احمد رو تو تمام تیبل ها سرچ کنه


select * from table1 where match(col1, col2, col3) against ('some string')
union all
select * from table2 where match(col1, col2) against ('some string')
union all
select * from table3 where match(col1, col2, col3, col4) against ('some string')


نه دوست عزیر منظورم ابن نیست. ببین مثلا میگیم رکوردهایی از Table1رو برگردون که field1="hello" باشه. خب؟ حالا بیاد ببینه توی رکوردهای پیدا شده مقدار فیلد2 (همون فیلدی که با رنگ آبی مشخص کردم) چیا هستن بعد بیاد رکرودهایی از Table2رو برگردونه که مقدار فیلد2ش(که مشترک هست بین تیبل 1 و2) برابر با اون مقدارهاست. خب مسلما تعداد رکورد پیدا میکنه. حالا دوباره بیاد و نگاه کنه که مقدار فیلد3(همون فیلدی که با رنگ مشکی مشخص کردم) این رکوردها چیا هستن. و بره چک کنه توی Table3,4,5,6,7 رکوردهایی که فیلد3شون برابر با مقدارهای گام قبلی هست رو پیدا کنه. به همین صورت مثلا بیاد باز از رکوردهایی پیدا شده از Table7 ببینه مقدارهای فیلد4شون چیا هستن و بعد از Table8 اون رکوردهایی که فیلد4شون برابر با این مقدارهاست رو برگردونه الا آخر... و در نهایت من از هر 10 جدول تعدادی رکورد پیدا کردم که میتونم تو 10تا گرید نمایش بدم. :تشویق:

ROSTAM2
سه شنبه 06 تیر 1391, 17:22 عصر
همه جدولا رو توي يك زمان كه قرار نيست FILLTER كني پس براي هر كدوم جداگونه كوئري بنويس خوب ت اونجايي كه مي خوايي ....

مگه اينطور نيست‌؟؟؟

ROSTAM2
سه شنبه 06 تیر 1391, 17:23 عصر
در ضمن در مورد برنامه هيچ توضيحي نداديد كه معلوم شه چه وقت چه جدولي بايد به چه طريقي Filter بشه

A_1397
سه شنبه 06 تیر 1391, 17:49 عصر
همه جدولا رو توي يك زمان كه قرار نيست FILLTER كني پس براي هر كدوم جداگونه كوئري بنويس خوب ت اونجايي كه مي خوايي ....

مگه اينطور نيست‌؟؟؟
اتفاقا باید همزمان فیلتر بشن. چون مثلا فرمی داریم و کاربر نام شخصی رو وارد میکنه و دکمه جستجو رو میزنه حالا نرم افزار باید عملیات جستجو رو با توجه به نام وارد شده توسط کاربر طبق زیر:

رکوردهایی از Table1رو برگردون که field1="hello" باشه. خب؟ حالا بیاد ببینه توی رکوردهای پیدا شده مقدار فیلد2 (همون فیلدی که با رنگ آبی مشخص کردم) چیا هستن بعد بیاد رکرودهایی از Table2رو برگردونه که مقدار فیلد2ش(که مشترک هست بین تیبل 1 و2) برابر با اون مقدارهاست. خب مسلما تعداد رکورد پیدا میکنه. حالا دوباره بیاد و نگاه کنه که مقدار فیلد3(همون فیلدی که با رنگ مشکی مشخص کردم) این رکوردها چیا هستن. و بره چک کنه توی Table3,4,5,6,7 رکوردهایی که فیلد3شون برابر با مقدارهای گام قبلی هست رو پیدا کنه. به همین صورت مثلا بیاد باز از رکوردهایی پیدا شده از Table7 ببینه مقدارهای فیلد4شون چیا هستن و بعد از Table8 اون رکوردهایی که فیلد4شون برابر با این مقدارهاست رو برگردونه الا آخر... و در نهایت من از هر 10 جدول تعدادی رکورد پیدا کردم که میتونم تو 10تا گرید نمایش بدم. :تشویق:
روی 10 تا جدول انجام بده و رکوردهای پیدا شده از هر کدام از جداول رو داخل 10 تا گرید نمایش بده.

ROSTAM2
سه شنبه 06 تیر 1391, 19:14 عصر
خوب اگه اينطوره قاعدتا بايد توي جدول اصلي اطلاعات اشخاص تمامي key هار و قرار بديد تا زماني كه اسامي ليست مي شن كليد ها رو بهمراه انتخاب هر كدام از آيتم ها بدست بياد تا ازون طريق بشه جدولاي ديگه رو Filter كرد

M.KH-SH
سه شنبه 06 تیر 1391, 21:48 عصر
دوست عزیز از کوئری های تو در تو باید استفاده کنی به صورتی که به فرض در کوئری اول یک where داری حالا در where اون یک کوئری دیگه داری

فکر کنم مشکل حل بشه

A_1397
چهارشنبه 07 تیر 1391, 08:26 صبح
دوست عزیز از کوئری های تو در تو باید استفاده کنی به صورتی که به فرض در کوئری اول یک where داری حالا در where اون یک کوئری دیگه داری

فکر کنم مشکل حل بشه
ممنون. فکر کنم این راه حل منطقی تر و جوابگویی باشه. فقط میشه لطف کنین یه کویری تودرتو برای دستور join مثال بزیند. فکرمیکنم دستور join برای این مسیله من بیشتر به درد بخوره تا where

omid85m
دوشنبه 19 تیر 1391, 17:37 عصر
* Select
From Students
Inner Join Selection
On Students.Student ID = Selection.Student ID
Where Selection.Course ID = 1012 AND Term
1=
'AND Year = ' 85 - 86

فکر کنم این کمکت کنه
اول اطلاعات از تیبل student گرفته میشه
با تیبل selection جوین میشه
بعد ارتباط بین جداول تعریف میشه
و سپس دستور where برای شرط گذاشتن