Resme göre herşey yolunda. tablo verilerini görmeden sıralamanın hatalı olduğunu söyleyemeyiz ki.
Öte yandan, bu order by ile resimdeki sonuçları verecek veriler mümkündür.
Mesela size hatalı görünen (68, 118, 4) ve (69, 118, 3) satırları aslında hatasız olabilir. Muhtemelen (68, 118) ve (69, 118) değerli satırlara baktığınızda (tablo ürerinde), 3. sütun için zaten başka alternatifi olmadığını göreceksiniz.
select * from TEDBIRLER
order by tehlikeler_id,tedbir_id;
aslında hem 113 hem de 118 için sorgu sonucu yazdığınız sqle göre geliyor, order by sorgu sonucunu belirttiğiniz alanlara göre sıralıyor,
order by id,tehlikeler_id,tedbir_id; dediğinizde
-sorgu sonuçlarını id alanına göre sırala,
-- id alanı aynı olan kayıtları tehlikeler_id alanına göre sırala,
--- id ve tehlikeler_id alanı aynı olan kayıtları tedbir_id alanına göre sırala
Ne yapmasını istiyorsunuz, tabloyu dikey olarak ikiye bölsün ve iki ayrı tabloymuş gibi farklı mı sıralasın ? O zaman order by ları farklı olan iki iki tane sub select i union ile birleştirmeyi deneyebilirsiniz. Ya da tasarımı gözden geçirebilirsiniz.
Order by ifadesini doğru anladığınızı, tablo tasarımının (siz veya kim yaptıysa) doğru yapıldığını varsayarak hareket ediyorsunuz. Peki emin misiniz ?
select * from TEDBIRLER
order by tehlikeler_id,tedbir_id;
tehlikeler_id tedbir_id
113 1
113 2
113 3
113 4
bu tablo çok klasik düz bir tablo oole karmaşık bir şey değil. Bu tablo tehlikeler tablosunun tedbirler ( Öneriler,Kazalar gibi diğer alt (detail) toblalarda var) alt (detail) tablosu tedbirlerin belli bir sıraya göre gösterilmesi gerekli.
select * from TEDBIRLER
order by tehlikeler_id,tedbir_id;
sorgusu sizin için yeterli olacaktır.
kullanıcı illaki ID veya kayıt sayısı görmek istiyorum derse o zamanda grid de rec no yu gösterirsiniz olur biter.
Order'larda soldaki kolon her zaman belirleyicidir ve sıralamayı doğru yapıyor. Bir sıkıntı yok. Sizin istediğiniz, ORDER BY ile yapılabilecek bir şey değil. Farklı bir metod izlemelisiniz. Anladığım kadarıyla şöyle bir şey istiyorsunuz,
A Kolonuna göre sıralasın, B Kolonunu da A Kolonundan bağımsız sıralasın, C Kolonunu da B ve A'dan bağımsız bir biçimde sıralasın. Yani her kolonu kendi içinde sıralasın.
Bunu ORDER BY ile yapmanız pek olası görünmüyor. Ayrıca sıralamayı B ye veya C'ye göre dizdiğinizde, Kaydın yeri değişecektir ve A Kolonundaki sıralama göz ardı edilmek zorunda kalacaktır.
Bence istediğiniz şey aslında ulaşmak istediğiniz şey olmayabilir. Bunu bir gözden geçirin bence.
Şimdi ORDER BY A, B, C yaptığınızda öncelik A Kolonundadır.
Kayıtları inceleyelim,
1. Kayıt -> A=61, B=55, C=1
2. Kayıt -> A=62, B=104, C=2
3. Kayıt -> A=63, B=104, C=1
ORDER BY'da 1. Kolon A ve dizilimi Doğru (61, 62, 63)
2. Kolon B ve dizilimi Doğru (55, 104, 104)
3. Kolon C ve dizilimi Yanlış (Gibi görünüyor) 1, 2, 1
Şimdi sorguyu ORDER BY C olarak yapsaydık kayıt dizilimi şu şekilde olacaktı,
61, 55, 1
63, 104, 1
62, 104, 2
Dizilim C'ye göre doğru ama A ye göre yanlış. Bu sebeple ana kuralı göz ardı etmeden, soldan sağa doğru sıralamanızı yaptığınızda, öncelik en soldan en sağa doğru gittiği için aşağıdaki sıralama doğrudur.
61, 55, 1
62, 104, 2
63, 104, 1
Eğer kayıtlarınız şöyle olsaydı
61, 55, 1
62, 104, 2
62, 104, 1 (Baştaki 62 sayısını bilerek verdim). O Zaman ORDER BY A, B, C olarak çektiğiniz sorgunun yanıtı da şöyle olacaktı,
61, 55, 1
62, 104, 1
62, 104, 2
Yani A Kolonundaki değer sabir kalınca bir sonraki kolondaki sıralama geçerli, oradaki, da sabit bir değer olunca otomatik olarak en sağdaki kolona göre dizilim gerçekleşecekti.
@Kuri_YJ açıklamanız sayesinde olayı anladım aslında sıralama dogru ama A kolonu değiştiği için sıkıntı oluşuyor. A yı iptal edince işim halloldu aklıma takılmıştı sayenizde (tum cevap yazan arkadaşlar) anladım .