MySQL 'ORDER BY FIELD'

Ünlü bir televizyon kanalı için hazırladığım internet sitesinde yayın akışını sıralamaya çalışırken bir an duraksadım. Yayın akışını basit bir ‘ORDER BY’ ile listelemek mümkün olmadı. Gazetelerin yayın akışı bölümlerinden de hatırlayacağınız gibi günün başlangıcı saat 7, 8 oluyor ve sıralama gece yarısına doğru devam ediyor. Kısa bir araştırmadan sonra ORDER BY FIELD özelliğini buldum ve başladım denemelere.

Örnek olarak bir hosting firmasının kullanıcılarla iletişim kurmak için kullandığı tickets tablosunu düşünelim.

ticketId onemlilik
1 Yuksek
2 Yuksek
3 Orta
4 Dusuk
5 Yuksek
6 Dusuk

Yüksek öncelikle ticketları üstte sıralamak için kullanacağımız sorgu aşağıdaki gibi olacak;

[sourcecode language=”sql”]
SELECT * FROM tickets ORDER BY FIELD(onemlilik,’Yuksek’,’Orta’,’Dusuk’)
[/sourcecode]

Aynı mantıkla yayın akışını sıralamak için program saatlerini sıralamam gerekiyor. Veritabanında saatlerin kayıt şekli 08:30, 10:50, 11:30 şeklinde ve ORDER BY FIELD cümleciğini kullanırken FIELD’ın birebir içeriğini yazmanız gerekiyor. Buna göre bütün saat olasıklarını yazmaya kalksam 24×60 = 1440 ihtimal var. Tam bu aşamada bir MySQL fonksiyonu daha keşfediyorum! SUBSTRING.

SUBSTRING ile saat bilgisinin sadece ilk 2 karakterini alarak ORDER BY FIELD için yazmam gereken ihtimal sayısını 24 e düşürüyorum ve sorgum aşağıdaki hale geliyor.

[sourcecode language=”sql”]
SELECT Day, Time, SUBSTRING(Time, 1, 2) as Tsort
FROM schedule WHERE Day = 1
ORDER BY FIELD(Tsort, ’07’, ’08’, ’09’, ’10’, ’11’, ’12’, ’13’, ’14’, ’15’, ’16’, ’17’, ’18’, ’19’, ’20’, ’21’, ’22’, ’23’, ’00’, ’01’, ’02’, ’03’, ’04’, ’05’, ’06’)
[/sourcecode]

Ama henüz sonuca ulaşmış değiliz 🙂 .

Bu sefer de son eklenen kayıttaki dakika bilgisi bir önceki kayıttan küçük olmasına rağmen sonrasında listeleniyor. Mesela 08:30, 08:40 tan sonra gözüküyor. Bunun için bir virgül koyup ikinci öncelikli olarak bir de Time’a göre sıralıyoruz ve sorgunun son hali aşağıda!

[sourcecode language=”sql”]
SELECT Day, Time, SUBSTRING(Time, 1, 2) as Tsort
FROM schedule WHERE Day = 1
ORDER BY FIELD(Tsort, ’07’, ’08’, ’09’, ’10’, ’11’, ’12’, ’13’, ’14’, ’15’, ’16’, ’17’, ’18’, ’19’, ’20’, ’21’, ’22’, ’23’, ’00’, ’01’, ’02’, ’03’, ’04’, ’05’, ’06’), Time
[/sourcecode]

Leave a Reply

Your email address will not be published. Required fields are marked *