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 عصر
دوستان خیلی ممنون کارم راه افتاد. فقط یه سوال دارم آیا تو نرم افزار میشه از کش استفاده کرده؟ چطوری؟
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.