• 02-08-2013, 16:10:18
    #1
    Üyeliği durduruldu
    Merhaba beyler,

    bir tabloda bir sorgu yapıyorum ve bu sorgu alaka derecesine göre sıralamak istiyorum.

    Örnek :

    Tablo adı oyuncaklar

    ben 1 ile 3 yaş arası oynanabilen oyuncakları listelemek istiyorum.

    Sorgunun tam sonuc hali şöyle.

    select * from oyuncaklar where yas1='1' and yas2='3'

    bana bu oyuncakları döker. Ama bana şuda lazım. Bu 0 ile 5 yaş arası olan oyuncaklarda.

    Şöyle 2 query var
    select * from oyuncaklar where yas1='1' and yas2='3'
    select * from oyuncaklar where yas1>=0 and yas1<='5' and yas2<=5

    bunları union ile birlerine bağlıyorum. O zaman tüm bu 2 kurala uyanları listeliyor. Ama benim isteğim ilk query sonucum üstte gelsin, alttaki query onun bitiminden sonra gelsin. Umarım anlatabilmişimdir.

    Kolay soru değil çözebilen olursa www.videoyap.com da 1 yıllık ücretsiz üyelik vericem.
  • 02-08-2013, 16:20:02
    #2
    zaten 0 dan büyük 5 ten küçük dediğinizde yaşı 1 ve 3 olanları da kapsamış olmuyor mu?

    edit:

    düşününce şöyle bir şey istediğinizi tahmin ediyorum. bir oyuncak var, bu oyuncağın ilk yaşı 1, son yaşı 3 ama genel aralığı da 0-5 yaş arası kategorisinde.

    siz de istiyorsunuz ki 0-5 yaş kategorisine giren ama ilk yaşı 1 son yaşı 5 olan oyuncakları listelesin.

    şimdi hocam select içinde select ile, union ile bu istediğiniz yapılır ama bu sol elle sağ kulağı tutmak olduğu için performanslı olmaz. bence siz oyuncaklar tablosunda 2 alan daha açıp birisine ilk_yas diğerine ikinci_yas ismini verin. tek sorguda bu alanları da and ile dahil edin. böylelikle daha performanslı ve okunaklı bir sorgu oluşturmuş olursunuz.
  • 02-08-2013, 18:53:10
    #3
    Üyeliği durduruldu
    fatihsarac adlı üyeden alıntı: mesajı görüntüle
    zaten 0 dan büyük 5 ten küçük dediğinizde yaşı 1 ve 3 olanları da kapsamış olmuyor mu?

    edit:

    düşününce şöyle bir şey istediğinizi tahmin ediyorum. bir oyuncak var, bu oyuncağın ilk yaşı 1, son yaşı 3 ama genel aralığı da 0-5 yaş arası kategorisinde.

    siz de istiyorsunuz ki 0-5 yaş kategorisine giren ama ilk yaşı 1 son yaşı 5 olan oyuncakları listelesin.

    şimdi hocam select içinde select ile, union ile bu istediğiniz yapılır ama bu sol elle sağ kulağı tutmak olduğu için performanslı olmaz. bence siz oyuncaklar tablosunda 2 alan daha açıp birisine ilk_yas diğerine ikinci_yas ismini verin. tek sorguda bu alanları da and ile dahil edin. böylelikle daha performanslı ve okunaklı bir sorgu oluşturmuş olursunuz.
    Merhaba hocam evet isteğimi anlamışsınız ama şöyle bir durum var. 1 oyuncak 3-4 yaş tablosunda cıkabiliyor. örneğin oyuncak 0-6 yaş oyuncağıysa. hem 0-1 yaş, hem 1-3 yaş, hemde 3-5 yaş arasındaki kategorilerde çıkabilir. Bu yüzden sql de 10.000 e yakın ürünü manuel girmem mümkün değil. union da iki sorgudan 1. sorgum ilk başta cıksa sonuçlarda sonraki sorgum 2. olarak cıksa tadından yenmez.
  • 02-08-2013, 19:18:30
    #4
    SELECT * FROM oyuncaklar WHERE yas1 <= 1 AND yas2 >= 3 ORDER BY ((yas1+yas2) - (1+3)) ASC

    0 - 6 bir oyuncak için, WHERE koşulu sağlanır. (0+6) - (1+3) = 2,
    1 - 3 bir oyuncak için, WHERE koşulu sağlanır. (1+3) - (1+3) = 0,
    2 - 3 bir oyuncak için, WHERE koşulu sağlanmaz.
    2 - 2 bir oyuncak için, WHERE koşulu sağlanır. (2+2) - (1+3) = 0

    yukarıdaki şekilde bazı durumlarda yanlış sıralama olabilir. Çünkü 1-3 yerine 12-18 kullanırsan, 0-18 yaş sarası bir oyuncak olursa 18 - 30, -12 olur. Bu durumda -1 ile çarpman gerekir order by kısmını o yüzden mysql if statement kullanman gerekir. Daha önce kullanmadım bir bakiyim yazarım sana son halini.
  • 02-08-2013, 19:43:05
    #5
    Üyeliği durduruldu
    Yengas adlı üyeden alıntı: mesajı görüntüle
    SELECT * FROM oyuncaklar WHERE yas1 <= 1 AND yas2 >= 3 ORDER BY ((yas1+yas2) - (1+3)) ASC

    0 - 6 bir oyuncak için, WHERE koşulu sağlanır. (0+6) - (1+3) = 2,
    1 - 3 bir oyuncak için, WHERE koşulu sağlanır. (1+3) - (1+3) = 0,
    2 - 3 bir oyuncak için, WHERE koşulu sağlanmaz.
    2 - 2 bir oyuncak için, WHERE koşulu sağlanır. (2+2) - (1+3) = 0

    Sıralama 2-2 ve 1-3 için sütun sıralaması olur, daha sonra arkalarından 0-6 yaş arası oyuncak gelir.

    İleri düzey php sorusu değil de, basit bir mysql sorgu sorunu bu.
    Merhaba hocam,

    öncelikle çok teşekkürler çok uğraşmışsın ama tam anlatamadım galiba.

    örneğin yas1=1 ve yas2=3 olan bir sorgu yapılcak.

    aynen senin sorgu alttaki gibi kopyaladım.

    SELECT * FROM oyuncaklar WHERE yas1 <= 1 AND yas2 >= 3 ORDER BY ((yas1+yas2) - (1+3)) ASC

    ürünlerden yas1=0 ve yas2=3 olan için order by : 0+3 - 1+3
    ürünlerden yas1=1 ve yas2=3 olan için order by : 1+3 - 1+3

    üstteki - olduğu için seninkinden daha küçük bir değere ulaşıyor. Bunu en yakın sayı rakamlarıyla örnek verdim. Yoksa yas1=0, yas2=18 olacak bir ürün olabilirdi.
  • 02-08-2013, 19:45:51
    #6
    Web_Scripti adlı üyeden alıntı: mesajı görüntüle
    Merhaba hocam,

    öncelikle çok teşekkürler çok uğraşmışsın ama tam anlatamadım galiba.

    örneğin yas1=1 ve yas2=3 olan bir sorgu yapılcak.

    aynen senin sorgu alttaki gibi kopyaladım.

    SELECT * FROM oyuncaklar WHERE yas1 <= 1 AND yas2 >= 3 ORDER BY ((yas1+yas2) - (1+3)) ASC

    ürünlerden yas1=0 ve yas2=3 olan için order by : 0+3 - 1+3
    ürünlerden yas1=1 ve yas2=3 olan için order by : 1+3 - 1+3

    üstteki - olduğu için seninkinden daha küçük bir değere ulaşıyor. Bunu en yakın sayı rakamlarıyla örnek verdim. Yoksa yas1=0, yas2=18 olacak bir ürün olabilirdi.
    evet ben onu yazarken düşünmüştüm fakat benzer bir örnek bulamamıştım. öyle bir durumda -1 ile çarpmanız lazım. if statement lazım yani onu bulayım hemen ama genel mantık o şekilde yani.

    Edit: ORDER BY (IF ((((yas1+yas2) - (x+y)) as uzaklik) < 0) THEN uzaklik * -1 ELSE uzaklik END) ASC bu tarz bir şey olacak yani ama syntax'dan tam emin değilim.

    Edit2: Şunu deneyin hocam ORDER BY kısmı yerine
    IF ((yas1+yas2) - (x+y)) AS s >= 0 THEN (ORDER BY s ASC) ELSE (ORDER BY (s * -1) ASC) END
    Ya da biraz daha iyi hali çalışırsa şu:

    ORDER BY (IF ((yas1+yas2) - (x+y)) AS s >= 0 THEN (s) ELSE (s * -1) END) ASC
  • 02-08-2013, 20:03:12
    #7
    Üyeliği durduruldu
    Yengas adlı üyeden alıntı: mesajı görüntüle
    evet ben onu yazarken düşünmüştüm fakat benzer bir örnek bulamamıştım. öyle bir durumda -1 ile çarpmanız lazım. if statement lazım yani onu bulayım hemen ama genel mantık o şekilde yani.

    Edit: ORDER BY (IF ((((yas1+yas2) - (x+y)) as uzaklik) < 0) THEN uzaklik * -1 ELSE uzaklik END) ASC bu tarz bir şey olacak yani ama syntax'dan tam emin değilim.

    Edit2: Şunu deneyin hocam ORDER BY kısmı yerine
    IF ((yas1+yas2) - (x+y)) AS s >= 0 THEN (ORDER BY s ASC) ELSE (ORDER BY (s * -1) ASC) END
    bir yerde küçük bir hata var galiba. düzeltip yayınlarım. Ellerine sağlık galiba çalışacaktır ve düzgün sonuç verecektir. Burada paylaşırım. Her ne olursa olsun videoyap.com a üye olup mailini verirseniz sürenizi ekleyim. Çok teşekkür ederim