PDA

View Full Version : جلوگیری از تکرار یک رکورد در خروجی (Distinct نیست)



Neo Persian
چهارشنبه 12 دی 1386, 12:04 عصر
سلام از جداول زیر میخوام یک Query به این صورت بگیرم:

با داشتن cid تمام product های مربوط به این cid گرفته شود البته تا اینجاش رو میدونم
مشکل در اینه که میخوام فقط یک عکس از جدول product_images گرفته شود چون در صورتی که یک product بیشتر از یک image داشته باشه در خروجی این product دو بار تکرار میشود

رکورد هایی که میخوام بگیرم:

products.id , products.name_en , product_categories.name_en , product_images.image

http://i5.tinypic.com/8e8x7uu.gif

sinpin
چهارشنبه 12 دی 1386, 12:40 عصر
... مشکل در اینه که میخوام فقط یک عکس از جدول product_images گرفته شود چون در صورتی که یک product بیشتر از یک image داشته باشه در خروجی این product دو بار تکرار میشودhttp://i5.tinypic.com/8e8x7uu.gif

پس چرا رابطه بین product و product_images یک به یک نیست ؟
یعنی لازم بوده که برای هر محصول چندتا عکس درج کنید ؟

Neo Persian
چهارشنبه 12 دی 1386, 13:32 عصر
من که عرض کردم امکان داره یه product بیش از یک عکس داشته باشه اگه فقط یه عکس داشت که دیگه وجود جدول product_images بی معنی بود و Query مورد نظرم راحت بود

SYNDROME
چهارشنبه 12 دی 1386, 15:50 عصر
چون در صورتی که یک product بیشتر از یک image داشته باشه در خروجی این product دو بار تکرار میشود

اگر مشکلتان تکرار محصول است خوب به جای Inner Join از Left Outer Join استفاده کنید.
موفق باشید

Neo Persian
چهارشنبه 12 دی 1386, 16:21 عصر
SELECT products.id, products.name_en AS product, product_categories.name_en, product_images.image
FROM products LEFT OUTER JOIN product_categories ON products.cid = product_categories.id LEFT OUTER JOIN product_images ON products.id = product_images.pid
WHERE products.cid = @cid

جواب نداد

SYNDROME
چهارشنبه 12 دی 1386, 18:55 عصر
ببینید این تغییر مشکل شما را حل می کند.


SELECT products.id, products.name_en AS product, product_categories.name_en, product_images.image
FROM product_categories
LEFT OUTER JOIN products
ON product_categories.id = products.cid
LEFT OUTER JOIN product_images
ON products.id = product_images.pid
WHERE products.cid = @cid

موفق باشید

Neo Persian
چهارشنبه 12 دی 1386, 19:58 عصر
دوست عزیز ممنون از توجه شما

ولی کار نکرد که نکرد!!!

SYNDROME
پنج شنبه 13 دی 1386, 05:51 صبح
دوست عزیز ممنون از توجه شما
ولی کار نکرد که نکرد!!!
پس یک مثال از مقادیری که در جداول است بزن و نتیجه ای که می خواهی به دست بیاوری تا شاید بتوان کمکتان کرد.
موفق باشید

Neo Persian
پنج شنبه 13 دی 1386, 10:04 صبح
http://i3.tinypic.com/6uh4djc.gif

نکته: فیلدهای که لازم نداشتم در خروجی باشند رو حذف کردم

------------------------------------------------------------------------

Query مورد نظرم باید به این صورت باشه که با دادن cid مثلا 62 تمام محصولاتی که دارای این cid هستند SELECT گرفته شوند. پس تا اینجا باید محصولاتی که id انها 26 و 29 است در خروجی باشند.

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

products.id , products.name_en , product_categories.name_en , product_images.image

همونطور که مشخصه product با آیدی 26 دارای 2 عکس در جدول product_images است و به همین دلیل در خروجی این product دوبار تکرار میشود.

یعنی به طور واضح تر من با دادن cid مثلا 62 این مقادیر رو بدست میارم:

http://i15.tinypic.com/7ynaukl.gif

همون طور که میبینید product با id 26 دو بار تکرار شده و البته نکته ای که از قلم انداختم این که عکسی که id آن از بقیه کوچکتر است رو باید نمایش بدم یعنی عکسی که اولین بار add شده که البته فکر کنم با یک ORDER BY حل بشه

امیدوارم واضح توضیح داده باشم

ممنون

JAFO_IRAN
پنج شنبه 13 دی 1386, 11:59 صبح
سلام

مدتی پیش کاملا به صورت اتفاقی با پست زیر سر و کله میزدم. موضوع بحث این نبود اما spای که اونجا مطرح بود شبیه پاسخ همین پرسش بود - شاید کمک کنه - هر چند که اونجا هم من شفاف بودم و اصلا معلوم نشد بقیه داستان به کجا رسید...

http://barnamenevis.org/forum/showthread.php?t=86620

ارادت

Neo Persian
پنج شنبه 13 دی 1386, 12:32 عصر
ممنون دوست عزیز ولی با موضوع مطرح شده من متفاوت بود

ali1564
پنج شنبه 13 دی 1386, 18:30 عصر
ببین با این کارت راه می افته..؟


DECLARE @getMin INT
SET @getMin =(SELECTMIN(id)FROM product_images WHERE pid = @PID)
SELECTMIN(product_images.id)as [image id], products.id as [product id], products.name_en , product_categories.name_en, product_images.[image]
FROM product_images
INNERJOIN products
ON product_images.pid = products.id
INNERJOIN product_categories
ON products.cid = product_categories.id
WHERE products.id = @PID AND product_images.id = @getMax
GROUPBY products.id , products.name_en , product_categories.name_en, product_images.[image]

Neo Persian
پنج شنبه 13 دی 1386, 18:33 عصر
به به آقا علی.....دستت درست خیلی کمکم کرد

sinpin
پنج شنبه 13 دی 1386, 23:17 عصر
من که عرض کردم امکان داره یه product بیش از یک عکس داشته باشه اگه فقط یه عکس داشت که دیگه وجود جدول product_images بی معنی بودو Query مورد نظرم راحت بود
نه الزاما - بستگی به طراحی داره - منکر وجود رابطه های یک به یک که نیستید، هستید ؟