Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

MySQL'de bir sayıya göre sıralama


Brigand

Öne çıkan mesajlar

Selamlar;

Şindik şöyle bir örnek veriyim hemen, time'a göre ASC olarak sıralıyorum ama bugünün time'ından eski time'ları en sonra atıp sıralatmak istiyorum.

Mesela bugünün time'ına 4 diyelim. 1-10 arası sayılar şöyle olmalı benim istediğime göre

4,5,6,7,8,9,10,1,2,3

Bunu MySQL'de yapabilirmiyiz?

Yapamıyorsam sql ile iki sorguda yaptıracam. Ama yapabiliyorsak hoş olur yani.
Link to comment
Sosyal ağlarda paylaş

Evet en rahatı öyle olur. Ama yok ben dehşet sorgular yaparım deyip uğraşmak istersen tek sorgu için fikir vereyim.

ORDER BY dedikten sonra iki değer verirsen nasıl çalıştığını biliyorsundur. İlk verdiğine göre sıralıyor, sonra aynı olan değerleri ikinci verdiğine göre sıralıyor. Bundan şöyle yararlanabilirsin:

Sorgunda ek bir sütun yaratıp istediğin günden önce olanlara bir değer, istediğin günden sonra olanlara başka bir değer verebilirsin. Sonra da kalkıp ilk önce bu sütuna göre, sonra zaman sütununa göre sıralarsın.

Mesela orjinal tablo şöyle olsun:

isim | sayı
pati | 1
veli | 5
bora | 4



4'dan önce gelen sayılar için ek sütun (sayı 4'dan küçükse x = 0, büyükse x = 1)

isim | x | sayı
pati | 0 | 1
veli | 1 | 5
bora | 1 | 4



sorgu ise fikir olarak şöyle:

SELECT isim, blah AS x, sayı
..
ORDER BY x DESC, sayı ASC


Hafif zorlayabilecek kısım o ek sütunu hazırlamakta. CASE falan kullanman gerekebilir. Ya da boolean ile yapabilirsin.

Başka yöntemler de vardır tabi. :)
Link to comment
Sosyal ağlarda paylaş

Mirage o ek sütunu tabloya ben mi ekleyecem? Yani ALTER ile tabloyu değiştirip bir sütun ekle mi diyorsun?

Çünkü dediğim şey bir zamanı sıralamak olduğu için zaman sürekli değişken olacaktır ve dediğin gibi sütun ekleyip 0,1 gibi değer vermek işe yaramayacaktır çünkü bugünün 1 değeri yarın 0 olabilir, sürekli güncellemek gerekir.
Link to comment
Sosyal ağlarda paylaş

Hayır hayır tabloyu değiştirmeyeceksin. Sütunu sonuç tablosuna ekleyeceksin. Aggregate function kullanman gerekecek muhtemelen ya da CASE kullanman gerekecek: http://databases.about.com/od/sql/l/aaaggregate1.htm

Mesela şöyle bir tablo düşün: isim, ürün tipi, stok sayısı

Bütün ürün tiplerini listeyelip, o tipten stokta kaç ürün var bakmak için şöyle bir şeyler yazılır genelde:

SELECT ürün tipi, SUM(stok sayısı) AS yeni_sütun
FROM hede
GROUP BY ürün tipi
ORDER BY yeni_sütun

Burda "yeni_sütun" dediğim sütunu sorgu sırasında sonuç tablosuna eklemiş oluyorsun. ORDER BY kullanarak bu yeni sütuna göre sıralayabiliyorsun. Yukarda verdiğim örnekte de buna benzer bir sütun etkleyip, sütun içinde bahsettiğin günden önce olanlarla sonra olanları ayırabilirsin.

Senin durumunda böyle bir şey uygulamak karışık ve muhtemelen pek verimli değil. Ama yine de bu tür şeylerde "nasıl yapılır acaba" diye kafa yormak geliştirici olabiliyor.
Link to comment
Sosyal ağlarda paylaş

Evet evet ondan dedim zaten yoksa php ile de yapabilecek durumdayım istediğim şeyi ama sql ile yapmak istiyorum eğitici olsun diye :)

Mirage, Sailor teşekkürler. Şu anda malum önerilerinizi test edemiyorum saate bağlı olarak :), yarın bakacağım bunlara teşekkür ederim :)
Link to comment
Sosyal ağlarda paylaş

çok sallama ve deneysel olarak yazıyorum, mantık hataları olması mümkündür.

SELECT * FROM hedehodo ORDER BY cast(-1*(sayi-4) AS CHAR)

4'ten büyükleri önce görmek istiyorsun diye şeyettim. tablodaki sayı sütunundan 4 çıkarınca senin sona gelmesini istediklerin negatif sayılar oluyorlar. fakat char sıralamasında - işareti sayılardan önce geliyor. bunu çözmek için ise -1 ile çarpıyoruz. yani senin ilk görmek istediğin sayılar -, istemediklerin + kalıyolar. sayılar değişiyor, ama sıraları değişmiyor. fakat -2, -1'den küçük bir sayı olduğu için int olarak sıralayamıyoruz, char olarak sıralıyoruz.

fakat şöyle bir sorun var ki, char sıralamasında -1, -2'den önce geldiği gibi, -10 da -2'den önce geliyor, ona nasıl çözüm bulursun bilemiyorum =)
Link to comment
Sosyal ağlarda paylaş

Mum_Chamber said:
çok sallama ve deneysel olarak yazıyorum, mantık hataları olması mümkündür.

SELECT * FROM hedehodo ORDER BY cast(-1*(sayi-4) AS CHAR)

4'ten büyükleri önce görmek istiyorsun diye şeyettim. tablodaki sayı sütunundan 4 çıkarınca senin sona gelmesini istediklerin negatif sayılar oluyorlar. fakat char sıralamasında - işareti sayılardan önce geliyor. bunu çözmek için ise -1 ile çarpıyoruz. yani senin ilk görmek istediğin sayılar -, istemediklerin + kalıyolar. sayılar değişiyor, ama sıraları değişmiyor. fakat -2, -1'den küçük bir sayı olduğu için int olarak sıralayamıyoruz, char olarak sıralıyoruz.

fakat şöyle bir sorun var ki, char sıralamasında -1, -2'den önce geldiği gibi, -10 da -2'den önce geliyor, ona nasıl çözüm bulursun bilemiyorum =)

mod 10000 yaparsan daha mantikli olur. Hepsini number yapmis olursun, boylece daha hizli islem yapilir. Char olarak karsilastirmak cok uzun surer.
Link to comment
Sosyal ağlarda paylaş

Evet o 0 ve 1 olayını ben de anlamadım.

Ama deneim ve riglous'un dediği oldu. Yani şöyle sıralıyor

45678910231

diye salladım 0231 kısmını sıralamıyor onları sql'e girildiği şeklinde alıyor direk. Onlar negatif oluyorlar bu arada. Yani bi iki denedim böyle olduğunu gördüm ben. Niye öyle yaptığını da çözemedim wallaha :)
Link to comment
Sosyal ağlarda paylaş

Sen order by'da hicbir sey belirtmezsen, tabloda gozukmeyen rowid diye bir kolon vardir (mysql'de ne deniyor bilmiyorum, oracle'da rowid), her halukarda onu kullanir. id-4 dersen ilk 4 id'yi atliyor, daha sonra gelenleri listeliyor, sona da id olarak alamadiklarini diziyor ki bu asamada rowid'yi kullaniyor. Eger mod kullanirsan muhtemelen calisir, zira -1 10'luk sistemde 9'a map eder, vs. vs. Soyle yapiyoruz, id'lerin oldugu kolonu aliyorsun her halukarda;
select *, mod(id-4,10000) order_by_row from my_table order by order_by_row
gibi bir sey yaparsan calisir muhtemelen

0 ve 1 diye bahsettigim... Bununla alakasi yok, ben olaylari karistirdim. id'leri siralarken 0'dan basladigini dusunmemistim, id-4 yaptim ilk basta. Sonra calismayinca nooluyoruz dedim o satiri yazdim, aciklamasi spoiler'da, konumuzla bi alakasi yok.

Simdi mysql'den emin degilim ama muhtemelen onda da aynidir, eger sen substr(text, 0, 10) dersen text'ten 0'dan baslayarak ilk 10 karakteri almasi gerekli. Ayni mantikla substr(text, 1, 10) yazinca ilk karakteri atlamasi gerekli ama oyle olmuyor. 0 ve 1 ayni yerden baslatiyor.

Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...