PDA

View Full Version : انتخاب در SQL



soleimani.em
دوشنبه 15 اردیبهشت 1393, 23:55 عصر
سلام،
من چندتا تیبل دارم (اطلاعات شرکتها، اطلاعات کاربرها، خرید) که از اونها کوری گرفته میشه و حاصل کوری توی یه دیتاگرید نمایش داده میشه حالا، مشکلی که من دارم اینه چون من تو جدول اطلاعات شرکت ها طرف حساب رو با شخص خریدار رو تو یه جدول دارم و تو جدول خرید فقط آیدی اونها ثبت شده هنگام اجرای کوری توی دیتا گرید بجای آیدی شرکت و شخص خریدار نام اونها نشون داده بشه.
ولی چون هم اطلاعات فروشگاه ها و هم اطلاعات اشخاص توی یه فیلد تو جدول اطلاعات شرکتها هستند وقتی میخوام کوری بگیرم نمیتونم به درستی نمایش بدم.دوستانی که تو این زمینه تجربه دارند لطفاً منو راهنمایی کنند.

جدول اطلاعات شرکت ها: -



CoID
Title


1
شرکت برنامه نویس


2
سلیمانی


3
شرکت حفار یر


4
احمدی


جدول کاربر ها



Userid
name


1
محمد


2
علی



جدول خرید



PurchaseID
CoID
Buy-CoID
Userid
ConfirmiD
Dateday


1
1
2
1
2



2
3
4
1
1



3
1
4
2
2



چیزی که من میخوام تو دیتا گرید نمایش بدم


PurchaseID
عنوان شرکت
خریدار
ثبت کننده
تایید کننده
تاریخ


1
شرکت برنامه نویس
سلیمانی
محمد
علی



2
شرکت حفار یر
احمدی
محمد
محمد



3
شرکت برنامه نویس
احمدی
علی
علی




ضمناً فیلدهای خریدار و عنوان شرکت از جدول اطلاعات شرکت ها و ثبت کننده و تایید کننده از جدول کاربرها گرفته می شوند

rezayeman
سه شنبه 16 اردیبهشت 1393, 08:58 صبح
شما وقتی جدولهارو جوین میکنی تو دستور select مقادیر ستونهارو به جای id از name بگیر. مثلا

select purchaseID, title, ...

from company inner join users on ...

soleimani.em
سه شنبه 16 اردیبهشت 1393, 09:28 صبح
شما وقتی جدولهارو جوین میکنی تو دستور select مقادیر ستونهارو به جای id از name بگیر. مثلا

select purchaseID, title, ...

from company inner join users on ...

دوست عزیز مشکل من دقیقاً برای فیلد تایید کننده و خریدار در جدول خرید هست! چون من اطلاعات
Buy-CoID و CoID رو از جدول اطلاعات شرکتها میگیرم و اطلاعات ConfirmiD و Userid رو از جدول کاربرها میگیرم این مشکلو دارم اگه فیلد Buy-CoID رو از جدول جداگانه ای میگرفتم این مشکلو نداشتم. ولی برای کار من منطقی نیست که دو جدول داشته باشم با اطلاعات مساوی و این موضوع برای ConfirmiD هم برقراره.

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

SELECT DocumentReceipt.DRiD, DocumentReceipt.Dollar, DocumentReceipt.Zooks, DocumentReceipt.DRNumber, DocumentReceipt.DRAsto, DocumentReceipt.DRDate,infoContact.ContactName, infoContact.ContactName AS ContactiDBU, DocumentReceipt.Status, UserControl.Name_Family AS ConfirmiD, DocumentReceipt.Comment, DocumentReceipt.FYear, UserControl.Name_Family, DocumentReceipt.DateDay FROM infoContact ON DocumentReceipt.ContactiD = infoContact.ContactId INNER JOIN UserControl ON DocumentReceipt.UseriD = UserControl.UseriD

rezayeman
سه شنبه 16 اردیبهشت 1393, 11:50 صبح
خوب جوابم درست بود دیگه

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

company(CoId-CoName-tell-descript( و جدول user به این صورت USers(uid-uname-username-pass) و جدول خرید به این صورت باشه buy(id-uid-coid-buydescript(

حالا میخوایم ببینیم چه کسی از چه شرکتی خرید کرده

select u.uname, co.coname, co.tell, b.buydescript

from (buy b inner join users u on u.uid = b.uid) inner join
company c on b.coid = c.coid

soleimani.em
سه شنبه 16 اردیبهشت 1393, 20:38 عصر
دوست عزیز، جدول خرید من دو تا فیلد با ID مشترک داره یعنی
ConfirmiD و UseriD دوتاشون از جدول user گرفته میشن در اصل ConfirmiD همون useriD هست فقط اسمش عوض شده، منتها تو جدول خرید ConfirmiD تایید کننده هست و UseriD ثبت کننده.

rezayeman
چهارشنبه 17 اردیبهشت 1393, 10:21 صبح
خوب شما کل فیلدهای جدول user اینجا قرار ندادین

جدول user با خودش join کن ببین کارت راه میفته

soleimani.em
چهارشنبه 17 اردیبهشت 1393, 14:26 عصر
خوب شما کل فیلدهای جدول user اینجا قرار ندادین

جدول user با خودش join کن ببین کارت راه میفته


rezayeman (http://barnamenevis.org/member.php?214108-rezayeman) عزیز ،
فکر کنم من منظورمو بد رسوندم، جدول همون جدولهای بالا هستن. منتها کاری که من کردم و توش گیرم اینه که تو جدول خرید من یکبار userid رو بعنوان شخص ثبت کننده اطلاعات و باز همون userid رو رو بعنوان شخص تایید کننده اون اطلاعات ذخیره کردم که عنوان فیلدرو گذاشتم ConfirmiD. پس من از فیلد userid جدول کاربرها در جدول خرید دوبار استفاده کردم برای جدول اطلاعات شرکت ها هم همینکار کردم، CoID که از جدول شرکتها گرفته میشه باز تو جدول خرید یکبار بعنوان شرکتی که جنس از ش خرید شده "CoID" و یکبار دیگه از همون CoID بعنوان شخصی که اون جنس رو خریده که بهش میگن کارپرداز با عنوان Buy-CoID درجدول خرید دارم.

soleimani.em
چهارشنبه 17 اردیبهشت 1393, 14:44 عصر
اینم اصل جدول ها
118748اینم کد

SELECT DocumentReceipt.DRiD, DocumentReceipt.Dollar, DocumentReceipt.Zooks, DocumentReceipt.DRNumber, DocumentReceipt.DRAsto, DocumentReceipt.DRDate, infoContact.ContactName, infoContact.ContactName AS Expr1, DocumentReceipt.Status, UserControl.Name_Family, DocumentReceipt.FYear, DocumentReceipt.Comment, UserControl.Name_Family AS Expr2, DocumentReceipt.DateDay FROM UserControl INNER JOIN DocumentReceipt ON UserControl.UseriD = DocumentReceipt.ConfirmiD AND UserControl.UseriD = DocumentReceipt.UseriD INNER JOIN infoContact ON DocumentReceipt.ContactiD = infoContact.ContactId AND DocumentReceipt.ContactiDBU = infoContact.ContactId

rezayeman
پنج شنبه 18 اردیبهشت 1393, 08:00 صبح
اینم اصل جدول ها
118748اینم کد

SELECT DocumentReceipt.DRiD, DocumentReceipt.Dollar, DocumentReceipt.Zooks, DocumentReceipt.DRNumber, DocumentReceipt.DRAsto, DocumentReceipt.DRDate, infoContact.ContactName, infoContact.ContactName AS Expr1, DocumentReceipt.Status, UserControl.Name_Family, DocumentReceipt.FYear, DocumentReceipt.Comment, UserControl.Name_Family AS Expr2, DocumentReceipt.DateDay FROM UserControl INNER JOIN DocumentReceipt ON UserControl.UseriD = DocumentReceipt.ConfirmiD AND UserControl.UseriD = DocumentReceipt.UseriD INNER JOIN infoContact ON DocumentReceipt.ContactiD = infoContact.ContactId AND DocumentReceipt.ContactiDBU = infoContact.ContactId



دوست من خدمتت که عرض کردم

شما اگه یه بار از userid استفاده میکردی با یه بار join کردن با جدول user کارت راه میافتاد اما چون 2 بار از userid استفاده میکنی باید جدول خریدتو 2 بار با جدول user جوین کنی و توی شرطی که برای on مینویسی یه بار
ConfirmiD از جدول خرید رو مساوی با
Userid در جدول user قرار بده و یه بار Userid از جدول user را با
Userid از جدول خرید مساوی هم قرار بده.

select users.name from (buy inner join users on buy.userid = users.userid)
inner join users on buy.confirmid = users.userid

where ...

soleimani.em
پنج شنبه 18 اردیبهشت 1393, 12:45 عصر
rezayeman (http://barnamenevis.org/member.php?214108-rezayeman)
عزیز ، مشکل من حل شد و کوئری نهایی به شکل زیر دراومد.
ولی مشکل جدید اینه که ردیفها تکرار میشن. مثلا من تو بانک 3 ردیف اطلاعات دارم ولی تو کوری 4 تا نشون میده. لطف کن یه نگاهی به این کدها بنداز ببین کجاشون اشتباهه. ممنون



SELECT infoContact_1.ContactName AS Expr1, infoContact.ContactName, UserControl.Name_Family, UserControl_1.Name_Family AS Expr2
FROM DocumentReceipt INNER JOIN
infoContact AS infoContact_1 ON DocumentReceipt.ContactiD = infoContact_1.ContactId INNER JOIN
infoContact ON DocumentReceipt.ContactiDBU = infoContact.ContactId INNER JOIN
UserControl AS UserControl_1 ON DocumentReceipt.ConfirmiD = UserControl_1.UseriD INNER JOIN
UserControl ON DocumentReceipt.UseriD = UserControl_1.UseriD

rezayeman
شنبه 20 اردیبهشت 1393, 20:30 عصر
قبل اسم ستونها distinct اضافه کن مثلا
Distinct(infocontact.contactname) اینجوری هر سطر تکراریو حذف میکنه

rezayeman
دوشنبه 22 اردیبهشت 1393, 07:51 صبح
البته به جای distinct می تونی از GROUP BY هم استفاده کنی

argess
دوشنبه 22 اردیبهشت 1393, 10:57 صبح
کار مشکلی نیست. شما به ازای هر FK که در جدول خرید دارید باید یکبار Join بزنید . اگر مثلا 2 تا FK دارید که PK آنها همه در یک جدول است خوب باید 2 بار بین جدول خرید و جدول کاربران Join بزنید. البته هر بار جدول کاربران را با یک Alias جدید به Query اضافه کنید.


Select Comp.*, User1.Name as RegisterName, User2.Name as OkName From Comp
Inner Join User User1 On ...
Inner Join User User2 On ...





اگر سئوال تخصصی داشتید در آدرس زیر قرار دهید
http://sorterir.majikblog.com

soleimani.em
چهارشنبه 24 اردیبهشت 1393, 22:35 عصر
دوستان خیلی ممنون کارم راه افتاد. فقط یه سوال دارم آیا تو نرم افزار میشه از کش استفاده کرده؟ چطوری؟