PDA

View Full Version : مشکل در دستور sql



nima_far
شنبه 04 مهر 1394, 15:58 عصر
سلام. من دو جدول محصول و عکس دارم، عکسای محصولات رو داخل جدول عکس دخیره میکنم. فقط مشکی اینجاست وقتی بیشتر از یک عکس(رکورد) برای یک محصول داخل جدول داشته باشم. زمان نمایش محصول رو به تعداد عکس هاش تکراری نشون میده. من می خوام فقط یک رکورد از هر محصول رو نمایش بده و تکراری نباشه محصولات. (یعنی یکی از عکسا رو انتخاب کنه برای هر محصول)

دستور اس کیو ال من : select top 10 * from product,img where product.product_id=img.product_id ORDER BY date desc,time desc
جدول محصول : product_id,name,date,time
جدول عکس: img_id,product_id,img_url

نتیجه ای که با این دستور می گیرم >>>
محصول x با عکس 1
محصول x با عکس 2
محصول n با عکس 3
محصول m با عکس 4
(نمی خوام محصول x دوبار تکرار شه)

ممنون میشم اگر راهنمایی کنید. خیلی سعی کردم از select تو در تو استفاده کنم اما نتونستم. ممنون

nazanin_asadi_1
شنبه 04 مهر 1394, 16:13 عصر
عکسها رو محدود نکنید یه روشی که خودم ازش استفاده میکنم اینه :
یه جدول که نام عکس ها رو توش ذخیره میکنم
یه جدول هم که مشخصات کالا رو ذخیره میکنم

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

شماتنها کاری که نیاز دارین یه فیلد به جدول کالا اضافه کنید و آی دی یکی از عکسهای مربوط به کالا رو توش ذخیره کنید

همه عکسهای مربوط به کالا رو لیست کنید و یه Radio بزارین که با انتخاب هر کدوم عکس پیش فرض اون بشه واسه کالا


البته با این ساختاری که شما داری شاید با اضافه کردن دستور DISTINCT fieldimg کارتون پیش بره ولی بهتره از روش اول استفاده کنی


یه روش دیگه هم هست اینه که توی خود جدول عکسها یه فیلد دیگه بزاری که مشخص کنه کدوم عکس به صورت پیشفرض قراره نمایش بده

Mr.Brown
شنبه 04 مهر 1394, 16:26 عصر
امتحانش کن ببین چطوره

select * from (select *, row_number() over(partition by product.product_id order by date desc) as rnk
from product,img where product.product_id=img.product_id)d where rnk=1 ORDER BY date desc,time desc

upper of min
یک شنبه 05 مهر 1394, 11:43 صبح
سلام. من دو جدول محصول و عکس دارم، عکسای محصولات رو داخل جدول عکس دخیره میکنم. فقط مشکی اینجاست وقتی بیشتر از یک عکس(رکورد) برای یک محصول داخل جدول داشته باشم. زمان نمایش محصول رو به تعداد عکس هاش تکراری نشون میده. من می خوام فقط یک رکورد از هر محصول رو نمایش بده و تکراری نباشه محصولات. (یعنی یکی از عکسا رو انتخاب کنه برای هر محصول)

دستور اس کیو ال من : select top 10 * from product,img where product.product_id=img.product_id ORDER BY date desc,time desc
جدول محصول : product_id,name,date,time
جدول عکس: img_id,product_id,img_url

نتیجه ای که با این دستور می گیرم >>>
محصول x با عکس 1
محصول x با عکس 2
محصول n با عکس 3
محصول m با عکس 4
(نمی خوام محصول x دوبار تکرار شه)

ممنون میشم اگر راهنمایی کنید. خیلی سعی کردم از select تو در تو استفاده کنم اما نتونستم. ممنون

سلام دوست عزیز
فرض کنید جدول محصول ما نامش باشه M و جدول عکس های ما باشه PH و M.NAME نام محصول از جدول M باشد
و PH.LINK لینک تصویر محصول باشه و ID_FK کلید خارجی باشه در جلدو PH و M کلید اصلی باشه در جلدو M بنابر این داریم:
SELECT PH.ID_KF , PH.LINK , M.ID , M.NAME FROM M INNER JOIN PH
GROUP BY PH.ID_FK
ON M.ID = PH.ID_FK

می تونید این رو هم ببینید
http://s5.picofile.com/d/87f62d0a-e447-42b5-9391-39101984eb60/Part1.rar
موفق باشید:لبخندساده:

nima_far
یک شنبه 05 مهر 1394, 16:06 عصر
عکسها رو محدود نکنید یه روشی که خودم ازش استفاده میکنم اینه :
یه جدول که نام عکس ها رو توش ذخیره میکنم
یه جدول هم که مشخصات کالا رو ذخیره میکنم

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

شماتنها کاری که نیاز دارین یه فیلد به جدول کالا اضافه کنید و آی دی یکی از عکسهای مربوط به کالا رو توش ذخیره کنید

همه عکسهای مربوط به کالا رو لیست کنید و یه Radio بزارین که با انتخاب هر کدوم عکس پیش فرض اون بشه واسه کالا


البته با این ساختاری که شما داری شاید با اضافه کردن دستور DISTINCT fieldimg کارتون پیش بره ولی بهتره از روش اول استفاده کنی


یه روش دیگه هم هست اینه که توی خود جدول عکسها یه فیلد دیگه بزاری که مشخص کنه کدوم عکس به صورت پیشفرض قراره نمایش بده


سلام . مرسی از راهنماییتون . ولی چون یه فیلد اضافیه نمی خوام از روش اول استفاده کنم. DISTINCT fieldimg هم تست کردم چون چندتا صفت رو میگیرم اینم جواب نمیده

nima_far
یک شنبه 05 مهر 1394, 16:10 عصر
امتحانش کن ببین چطوره

select * from (select *, row_number() over(partition by product.product_id order by date desc) as rnk
from product,img where product.product_id=img.product_id)d where rnk=1 ORDER BY date desc,time desc

سلام . این کد خطای : the column 'id' was specified multiple time for d رو میده..

کدی که با توجه به بانکم تغییر دادم:
select * from (select *, row_number() over(partition by ads.id order by date desc) as rnk
from ads,img where ads.id=img.ads_id)d where rnk=1 ORDER BY date desc,time desc

nima_far
یک شنبه 05 مهر 1394, 16:20 عصر
سلام دوست عزیز
فرض کنید جدول محصول ما نامش باشه M و جدول عکس های ما باشه PH و M.NAME نام محصول از جدول M باشد
و PH.LINK لینک تصویر محصول باشه و ID_FK کلید خارجی باشه در جلدو PH و M کلید اصلی باشه در جلدو M بنابر این داریم:
SELECT PH.ID_KF , PH.LINK , M.ID , M.NAME FROM M INNER JOIN PH
GROUP BY PH.ID_FK
ON M.ID = PH.ID_FK

می تونید این رو هم ببینید
http://s5.picofile.com/d/87f62d0a-e447-42b5-9391-39101984eb60/Part1.rar
موفق باشید:لبخندساده:

مرسی خیلی ممنون ولی این کدم خطا میده چون چندتا فیلد تو select می خوام . اگر فقط همون فیلد انتخاب شده تو group by باشه مشکلی نداره ولی چون بقیه مقادیرو لازم دارم خطا میده. یه روشی داشت به کمک select تو در تو و همین group by، ولی نتونستم پیدا کنم.

کد تست شده با تغییرات فیلد های بانک:
SELECT dbo.img.ads_id, dbo.img.url, dbo.ads.id, dbo.ads.title
FROM dbo.ads INNER JOIN
dbo.img ON dbo.ads.id = dbo.img.ads_id
GROUP BY dbo.img.ads_id


البته یه دستوری نوشتم جواب میده ولی خیلی طولانی و به نظر غیر معمول میاد . دنبال یه کد بهینه ترم.
کد : (جواب میده ولی خیلی مسخره به نظر میاد، و اینکه شاید بخوام 10 تا ستون رو بگیرم بد ترم میشه)
SELECT MAX(DISTINCT dbo.ads.id) AS EXPR1, MAX(DISTINCT dbo.ads.user_id) AS EXPR2,
MAX(DISTINCT dbo.img.url) AS img_url
FROM dbo.ads INNER JOIN
dbo.img ON dbo.ads.id = dbo.img.ads_id
GROUP BY dbo.img.ads_id

nima_far
دوشنبه 06 مهر 1394, 15:59 عصر
دوستی نظر و راه حل دیگه ای نداره؟؟؟؟

nima_far
سه شنبه 07 مهر 1394, 16:49 عصر
خب مشکلم حل شد ، دستور رو اینجا میزارم شاید کسی مثل من به این مشکل بخوره.

select top 10 *,(select top 1 url from img where img.ads_id=ads.id)as url from ads ORDER BY date desc,time desc