folder Tahribat.com Forumları
linefolder Database - Veritabanı
linefolder SQL Sorgusu İçin Yardım-



SQL Sorgusu İçin Yardım-

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    alli
    alli's avatar
    Kayıt Tarihi: 27/Ağustos/2005
    Erkek

    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 ?


    https://i.imgur.com/lCgZ0V0.jpg
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    AsortiC
    AsortiC's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek
    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

  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    YeniHarman
    YeniHarman's avatar
    Kayıt Tarihi: 17/Haziran/2012
    Erkek

    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

    Olaylara karışmayın!
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    crafty
    crafty's avatar
    Kayıt Tarihi: 19/Eylül/2006
    Erkek

    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


    Kasnak yuvarlandı elek oldu, eski orospular melek oldu...
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    angels_demos
    angels_demos's avatar
    Kayıt Tarihi: 03/Haziran/2006
    Erkek
    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

  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Mali
    Mali's avatar
    Kayıt Tarihi: 28/Mart/2007
    Erkek

    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

    Akilli olanlar sebepler konusunda tartışırlar. Ama nihai kararı sonuçta sürekli aptallar verir...!
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    alli
    alli's avatar
    Kayıt Tarihi: 27/Ağustos/2005
    Erkek

    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

     


    https://i.imgur.com/lCgZ0V0.jpg
Toplam Hit: 1450 Toplam Mesaj: 7