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.
İleri Düzey Php bilenler yardıma ihtiyacım var - UNION
6
●540
- 02-08-2013, 16:10:18Üyeliği durduruldu
- 02-08-2013, 16:20:02zaten 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Üyeliği durdurulduMerhaba 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.fatihsarac adlı üyeden alıntı: mesajı görüntüle
- 02-08-2013, 19:18:30SELECT * 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Üyeliği durdurulduMerhaba hocam,Yengas adlı üyeden alıntı: mesajı görüntüle
ö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:51evet 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.Web_Scripti adlı üyeden alıntı: mesajı görüntüle
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ı yerineIF ((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Üyeliği durduruldubir 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 ederimYengas adlı üyeden alıntı: mesajı görüntüle