PDA

View Full Version : تولید یک لیست Related( موضوعات مرتبط) و مرتب کردن آن با order by????



khadem1386
یک شنبه 16 بهمن 1390, 13:52 عصر
با سلام

یک جدول داریم که توی آن آهنگ های مختلف رجیستر شد- اینها ستونهای من هستند

ID
PersonName
StyleMusic
LaguageMusice

خوب همانطور که می بیند یک آهنگ می تواند صفتهای
نام خواننده آهنگ
سبک آهنگ (راک - جاز - سنتی - کلاسیک)
زبان ( فارسی - اسپانیایی - آلمانی - انگلیسی)

خوب حالا می خواهم وقتی که یک موسیقی در حال پخش است حدود 12 از موسیقی های مرتبط با آن موسیقی را لیست کنم و بگذارم پایین قسمت پخش)
روش آسان است می توانم در کوئری خودم در قسمت where از عملگر or استفاده کنم

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

مرتب کردن یک همچین لیستی چگونه است.

مثلا
اگر هر سه شرط تساوی را داشت در ابتدای لیست بیاید

و اگر مثلا دو شرط تساوی را داشت بعد آن و

و اگر مثلا یک شرط تساوی را داشت آخر همه بیاید.



منظورم هم اینکه بعضی ها چون شرطهای بیشتر ی دارند خوب بیشتر مرتبط هستند پس باید در بالای لیست بیایند
البته این مثلا هایی که می گویم مثال هست - و شاید روش بهتری برای مرتب سازی در اینگونه موارد باشه. یا حتی بتوانیم به بعضی از شرط ها امتیاز بیشتری بدهیم.



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

baktash.n81@gmail.com
یک شنبه 16 بهمن 1390, 15:45 عصر
سلام

ممکنه روشهای زیادی برای اینکار باشه ...

اما روش ساده ایی که به ذهن من می رسه اینه که شما 3 تا Select بنویس بعد نتیجه هارو با هم Union کن ... بعد تو Select اول یه ستون ثابت با مقدار 1 ایجاد کن ... تو دومی این ستون رو مقدار 2 بده ... و به همین ترتیب بعد اینها رو با هم Union کن و بر اساس اون فیلد ثابت Order by کن ...

baktash.n81@gmail.com
یک شنبه 16 بهمن 1390, 15:47 عصر
البته ... تو Select اول 3 تا شرط رو بنویس ... تو دومی 2 تا شرط (که البته حالت ها مختلف با هم Or می شوند) ... و تو سومی 1 شرط ...

khadem1386
دوشنبه 17 بهمن 1390, 10:03 صبح
با سلام به آقای بکتاش: متشکرم از توجه شما

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

سناریوی من همین الان هم خیلی ساده نیست به عنوان مثال چون ممکن بوده که یک خواننده چندتا آهنگ را خوانده باشه طبیعتا دوتا tabel دارم یکی برای لیست افراد و یکی برای لیست آهنگها و خوب دستور همین الان من هم یک دستور select است که از join استفاده کردم و همین الان هم دستور select من خیلی طولانی شده. و حتی مجبورم نام تمام ستونهای مورد نیازم را هم با نام table مورد نظر اضافه کنم و کلی داستان دار join کردن دیگه

از طرفی آنچیزی که شما می گوید هم کار من را، یا بعبارت بهتر حجم querystring من را اقلا چهار برابر می کنه. احساس خوبی برای cpu و کلا منابع سرور data-Base ندارم یک جیزی توی وجدام سنگینی می کنه و می گه بامرام پس اصل performance چی می شه ؟ یا بهم می گه این چه جور Normalize کردنه؟ آخرین باری که با وجدانم درگیر شدم برگشت بهم گفت پایگاه داده رو ورلکن برو تو استادیوم بوق بزن. از اون موقه تا بحال هم دیگه باهاش قهرم. این بود که من و وجدانم فکرهامون رو روی هم ریختیم و گفتم بیام یک میحیط مجازی تخصصی که خوراک شون query با مرغ است و خلاصه تلیت می کنند مسله رو توش. :)

این مثلا یک select یک لایه هست تازه


Select art.ID_ART, art.nameArt,art.image, art.flv, art.mp3 ,art.ID_person,art.Style, art.Lahje, art.makan_tolid,
art.zaman_tolid, art.comment, person.ID_person, person.name, person.family from art INNER JOIN
person on art.ID_person = person.ID_person

where( art.Style= '" & word1 &"' or person.ID_person = " & word2 & " or art.Lahje = '" & (word3") &"' ) and art.ID_ART <>" & "ArtID")

Order by person.ID_person desc





مرسی از توجه همه دوستان و آقای بکتاش

baktash.n81@gmail.com
دوشنبه 17 بهمن 1390, 14:02 عصر
خواهش می کنم قربان ...

در مورد حجم Query ها که مشکلش با sp حل می شه ... در خصوص اینکه Query هاتون الانم خیلی پیچیدست بهتره view و sp براشون درست کنی ( و حتی از Synonym استفاده کنی) که قابل فهمتر بشه ...

اما در مورد Performance این مشکل همیشه وجود داره ... و کلا این قضیه یه چیز نسبیه ... به نظر من یه طراحی بهینه می تونه نرمال کامل نباشه ... مخصوصا اگه تحت وب بخوای کار کنی ...

اما در مورد سئوالت ... یه نگاهی به Full Text Search بندازی بدی نیست ... من زیاد کار نکردم باهاش ...

بهزادصادقی
پنج شنبه 20 بهمن 1390, 00:49 صبح
سلام،

این جواب میده؟

if object_id( 'dbo.MusicByKhadem' ) is not null
drop table dbo.MusicByKhadem;
go

create table dbo.MusicByKhadem
(
ID int identity(1,1) primary key,
PersonName nvarchar(100) not null,
StyleMusic nvarchar(100) not null,
LanguageMusic nvarchar(100) not null
);
go

insert dbo.MusicByKhadem (PersonName, StyleMusic, LanguageMusic) values ('None', 'None', 'None');
insert dbo.MusicByKhadem (PersonName, StyleMusic, LanguageMusic) values ('DJ Khandem', 'None', 'None');
insert dbo.MusicByKhadem (PersonName, StyleMusic, LanguageMusic) values ('None', 'Classical Metal', 'None');
insert dbo.MusicByKhadem (PersonName, StyleMusic, LanguageMusic) values ('DJ Khandem', 'Classical Metal', 'None');
insert dbo.MusicByKhadem (PersonName, StyleMusic, LanguageMusic) values ('None', 'None', 'Bolivian Lori');
insert dbo.MusicByKhadem (PersonName, StyleMusic, LanguageMusic) values ('DJ Khandem', 'None', 'Bolivian Lori');
insert dbo.MusicByKhadem (PersonName, StyleMusic, LanguageMusic) values ('None', 'Classical Metal', 'Bolivian Lori');
insert dbo.MusicByKhadem (PersonName, StyleMusic, LanguageMusic) values ('DJ Khandem', 'Classical Metal', 'Bolivian Lori');


declare @person nvarchar(100) = 'DJ Khandem';
declare @style nvarchar(100) = 'Classical Metal';
declare @language nvarchar(100) = 'Bolivian Lori';

select top 12
x.PersonMatch + x.StyleMatch + x.LanguageMatch as Score,
x.*
from
(
select
k.*,
case when k.PersonName = @person then 1 else 0 end as PersonMatch,
case when k.StyleMusic = @style then 1 else 0 end as StyleMatch,
case when k.LanguageMusic = @language then 1 else 0 end as LanguageMatch
from
dbo.MusicByKhadem k
where
k.PersonName = @person
or k.StyleMusic = @style
or k.LanguageMusic = @language
) x
order by
Score desc;