SQL Sorgusu İçin Yardım-
-
Veritabanı dersi için sql db kullandığımız bir web sitesi hazırlamamız gerekiyor.
Hazırladığımız site spotify gibi müzik dinleme portalı, şuanda localde çalışıyor ve 8 tane tablosu var.
Şarkı filitreleme sorgularını oluştururken bir yerde takıldım. Düşündüğümüz filitre sayfasında tür, yıl, ülke, şarkının uzunluğu gibi değerler kullanıcıdan istenecek ve çıkan sonuçlar sayfaya yazdırılacak
Örneğin kullanıcı puanı 4 den fazla 2001 yılından sonra çıkan uzunluğu 3 dk dan uzun elektronik müzik türündeki parçaları isterse aşağıdaki sorgu çalışacak
select * from [dbo].[Song] left join [dbo].[Genre] on [dbo].[Song].[GenreID]=[dbo].[Genre].[ID] left join [dbo].[Country] on [Song].[CountryID]=[Country].[ID] Where [dbo].[Song].[Duration] >'3:00' And [dbo].[Song].[Year]>2001 And Score > 4 And [Genre].[Name] = 'Electronic' And [Song].[Score]=0 And [Country].[Language] = 'ENGLISH' And [Song].[CountryID] = 'USA' Order by [Song].[Duration]
Ancak bizim istediğimiz duruma pek uymuyor. Şöyleki eğer kullanıcı tür bölümüne bir değer girmezse, boş bırakırsa, tüm türlerin bastırılmasını istiyoruz. Yani yukardaki taslağın sabit kaldığını düşünelim WHERE [Genre].[Name]=ALL gibi birşey yapamıyoruz.
Her durum için ayrı ayrı sorgu oluşturmakda çok uzun sürüyor.
Bu tür durumlarda sizin yaptığınız çözüm nedir yada ne önerirsiniz ?
-
alli bunu yazdı
Veritabanı dersi için sql db kullandığımız bir web sitesi hazırlamamız gerekiyor.
Hazırladığımız site spotify gibi müzik dinleme portalı, şuanda localde çalışıyor ve 8 tane tablosu var.
Şarkı filitreleme sorgularını oluştururken bir yerde takıldım. Düşündüğümüz filitre sayfasında tür, yıl, ülke, şarkının uzunluğu gibi değerler kullanıcıdan istenecek ve çıkan sonuçlar sayfaya yazdırılacak
Örneğin kullanıcı puanı 4 den fazla 2001 yılından sonra çıkan uzunluğu 3 dk dan uzun elektronik müzik türündeki parçaları isterse aşağıdaki sorgu çalışacak
select * from [dbo].[Song] left join [dbo].[Genre] on [dbo].[Song].[GenreID]=[dbo].[Genre].[ID] left join [dbo].[Country] on [Song].[CountryID]=[Country].[ID] Where [dbo].[Song].[Duration] >'3:00' And [dbo].[Song].[Year]>2001 And Score > 4 And [Genre].[Name] = 'Electronic' And [Song].[Score]=0 And [Country].[Language] = 'ENGLISH' And [Song].[CountryID] = 'USA' Order by [Song].[Duration]
Ancak bizim istediğimiz duruma pek uymuyor. Şöyleki eğer kullanıcı tür bölümüne bir değer girmezse, boş bırakırsa, tüm türlerin bastırılmasını istiyoruz. Yani yukardaki taslağın sabit kaldığını düşünelim WHERE [Genre].[Name]=ALL gibi birşey yapamıyoruz.
Her durum için ayrı ayrı sorgu oluşturmakda çok uzun sürüyor.
Bu tür durumlarda sizin yaptığınız çözüm nedir yada ne önerirsiniz ?
hocam eğer tür bölümüne değer girilmesse şu sql çalışsın girilirse şu sql çalışsın diye yapabilirsin bence örnek
if request.form("sarkitur")="" then
sql
else
sql
end if
-
Stored Procedure kullanma şansınız varsa http://programmers.stackexchange.com/questions/160031/best-method-to-implement-a-filtered-search adresindeki çözümü deneyebilirsiniz.
...ya da...
http://stackoverflow.com/questions/11329823/add-where-clauses-to-sql-dynamically-programmatically adresinde önerildiği gibi WHERE 1=1 ile birlikte diğer koşulları kullanabilirsiniz.
Tabi sql sorgusunu dinamik de oluşturabilirsiniz. Örneğin
is_filter1_set
{
sql_add(filter1, value)....
}
YeniHarman tarafından 02/May/15 23:31 tarihinde düzenlenmiştir -
hocam tasarım kısmı nasıl onu bilmediğim için net bişey diyemiyorum ama şöyle birşey yapabilirsin
önce query0 diye bir string tanımladığını varsayalım
birinci kısım için
if tur <> "" then
if query0="" then
query0 = "tur = " & tur.txt
else
query0 = and "tur = " & tur.txt
end if
end if şeklinde devam ederek where bölümünü komple string olarak yazdırıp sonra sql cümleciğinde where bölümünden sonra query0 stringini yazdırarak sorgunu çekebilirsin
-
crafty bunu yazdı
hocam tasarım kısmı nasıl onu bilmediğim için net bişey diyemiyorum ama şöyle birşey yapabilirsin
önce query0 diye bir string tanımladığını varsayalım
birinci kısım için
if tur <> "" then
if query0="" then
query0 = "tur = " & tur.txt
else
query0 = and "tur = " & tur.txt
end if
end if şeklinde devam ederek where bölümünü komple string olarak yazdırıp sonra sql cümleciğinde where bölümünden sonra query0 stringini yazdırarak sorgunu çekebilirsin
En mantıklı yol bu uzun sql satiri yazmaya gerek yok
-
Eğer arama yaptıracaksan bence LIKE komutunu kullanman daha uygun olur
puan = Request.QueryString("puan")
yil = Request.QueryString("yil")
uzunluk = Request.QueryString("uzunluk")
tur = Request.QueryString("tur")
if puan = "" or yil = "" or uzunluk = "" or tur = "" then
'--------------------------- hepsi dahil
sql = "SELECT * FROM songs ORDER BY id DESC"
'---------------------------hepsi dahil sonu
else
'--------------------------- müzik seçimi
sql = "SELECT * FROM songs"
'--------------------------- müzik seçimi sonu
'--------------------------- puan seçimi
if (puan <> "") then
sql = sql & "(songs.puan LIKE '%"& puan &"%')"
end if
'--------------------------- puan seçimi sonu
'--------------------------- yil seçimi
if (yil <> "") then
sql = sql & " (songs.yil LIKE '%" yil"%')"
end if
'--------------------------- yil seçimi sonu
'--------------------------- uzunluk seçimi
if (uzunluk <> "") then
sql = sql & "(songs.uzunluk LIKE '%" &uzunluk& "%')"
end if
'--------------------------- uzunluk seçimi sonu
'--------------------------- tur seçimi
if (tur <> "") then
sql = sql & "(songs.tur LIKE '%" &tur& "%')"
end if
'--------------------------- tur seçim sonu
'--------------------------- Sıralama
sql = sql & " ORDER BY songs.id Desc"
'--------------------------- sıralama sonu
end if
Mali tarafından 03/May/15 19:39 tarihinde düzenlenmiştir -
Geç cevap verdiğim için kusura bakmayın yeni vakit buldum ödevlerden. Verdiğiniz cevapar için teşekkür ederim. Sizin yönlendirdiğiniz şekilde tasarladık sorguları. Filitre kısmında ilk olarak tüm query değişkenlerine "1=1" olarak atadık daha sonra if else ile boş olup olmadıklarını kontrol ettik. Eğer kulanıcı o query için bir değer girerse, misal süresi 2 dk dan uzun şeklinde, o querye [Duration]>user.duration atadık.
son sorgumuz da bu şekilde oldu.
SELECT [Album].[Name] as AlbumName, [Artist].[Name] as ArtistName,[Genre].[Name] as GenreName ,[Album].[Year] from [Album] left join [Artist] on [Album].[ArtistID]=[Artist].[ID] left join [Genre] on [Album].[GenreID]=[Genre].[ID] Where + query1+” And “+ query2+” And” +query3
Ana arama kutusuna da LIKE konutuyla sorgu ekledik.select * from [dbo].[Song] Where [dbo].[Song].[Name] Like '%ey%'
--icinde ey barindiran Sarkilar
select * from [dbo].[Album] Where [dbo].[Album].[Name] Like '%es%'
--icinde es barindiran albumler
select * from [dbo].[Artist] Where [dbo].[Artist].[Name] Like '%ri%'
--icinde ri barindiran artistler
Yardımlarınız için teşekkürler