Red Kit

WFN Üye
Konular
631
Mesajlar
631
Çözüm
0
Ticaret Puanı
0
Üyelik
24 Gün
Konum
Adana
Web Sitesi
Var
Alanı
Makale Yazarı
1/1
Konu sahibi
İstenen sonucu almak için kayıtları tarih veya zaman sütununa göre azalan sıralayıp ilk satırı seçin. Örneğin created_at kayıt oluşturulma zamanını tutuyorsa şu sorgu en yeni kaydı getirir:

SQL:
SELECT *
FROM orders
ORDER BY created_at DESC
LIMIT 1;

DESC, en yeni tarihin önce gelmesini sağlar; LIMIT 1 ise yalnızca ilk satırı döndürür. Sorgunun sonucundaki kayıt, created_at değeri en büyük olan kayıttır. Bunun doğru çalışması için tarih sütununun gerçekten kayıt zamanını göstermesi ve mümkünse NULL değerler içermemesi gerekir.

Kullanılan SQL sistemine göre yazım​


LIMIT her SQL sisteminde aynı şekilde kullanılmaz. En yaygın yazımlar şöyledir:
SQL sistemiEn yeni kaydı getirme
MySQL, PostgreSQL, SQLiteORDER BY created_at DESC LIMIT 1
SQL ServerSELECT TOP 1... ORDER BY created_at DESC
Oracle 12c ve sonrasıORDER BY created_at DESC FETCH FIRST 1 ROW ONLY
Standart yaklaşıma yakın kullanımORDER BY created_at DESC FETCH FIRST 1 ROW ONLY
Örneğin SQL Server’da sorgu şu şekilde yazılır:

SQL:
SELECT TOP 1 *
FROM orders
ORDER BY created_at DESC;

Oracle’da ise:

SQL:
SELECT *
FROM orders
ORDER BY created_at DESC
FETCH FIRST 1 ROW ONLY;

Hangi sözdizimini kullanacağınızı veritabanı sisteminize göre seçin. Sorguyu çalıştırdığınızda beklenen sonuç tek satırdır. Sonucun tarihini kontrol ederek gerçekten en güncel kaydı seçtiğinizden emin olun; yalnızca kaydın id değerinin büyük olması, o kaydın en yeni olduğunu kanıtlamaz.

Aynı tarihe sahip birden fazla kayıt varsa​


İki veya daha fazla kaydın created_at değeri aynıysa, yalnızca tarihe göre sıralama bu kayıtlar arasında belirli bir seçim garantisi vermez. Sonucu kararlı hâle getirmek için ikinci bir sıralama ölçütü ekleyin. id değeri artan ve benzersiz bir anahtarsa şu kullanım tercih edilebilir:

SQL:
SELECT *
FROM orders
ORDER BY created_at DESC, id DESC
LIMIT 1;

Bu sorgu önce en yeni tarihi seçer, tarihler eşitse id değeri en büyük olan kaydı getirir. Buradaki ikinci sıralama, eşit zamanlı kayıtlar arasından seçim kuralıdır; id değerinin büyük olması tek başına kaydın daha sonra oluşturulduğunu göstermez.

Eşit en yeni zamana sahip tüm kayıtları görmek istiyorsanız tek satır sınırlaması kullanmayın. Önce en büyük zamanı bulup aynı zamana sahip satırları seçebilirsiniz:

SQL:
SELECT *
FROM orders
WHERE created_at = (
    SELECT MAX(created_at)
    FROM orders
);

Bu sorgu birden fazla satır döndürürse, bunun anlamı bu kayıtların aynı en yeni zaman değerini paylaşmasıdır. Bu sonuç, kayıtların tamamen aynı olduğu anlamına gelmez; yalnızca karşılaştırılan tarih alanlarının eşit olduğunu gösterir.

Belirli bir kullanıcıya veya gruba ait en yeni kayıt​


En yeni kaydı bütün tablo yerine belirli bir kullanıcı için arıyorsanız koşulu sıralamadan önce ekleyin:

SQL:
SELECT *
FROM orders
WHERE user_id = 42
ORDER BY created_at DESC, id DESC
LIMIT 1;

Burada user_id = 42 yalnızca ilgili kullanıcıya ait kayıtları bırakır, ardından bu kayıtlar yenilik sırasına konur. Sonuç dönmezse bu, sorgudaki kullanıcı için tabloda eşleşen kayıt bulunmadığı anlamına gelir; tablonun tamamında kayıt olmadığı anlamına gelmez.

Her kullanıcı için en yeni kaydı almak ise farklı bir işlemdir. Bunun için ROW_NUMBER() gibi pencere işlevleri kullanılır:

SQL:
SELECT id, user_id, created_at, status
FROM (
    SELECT
        id,
        user_id,
        created_at,
        status,
        ROW_NUMBER() OVER (
            PARTITION BY user_id
            ORDER BY created_at DESC, id DESC
        ) AS row_number
    FROM orders
) AS ranked_orders
WHERE row_number = 1;

PARTITION BY user_id, sıralamayı her kullanıcı için ayrı yapar. Dış sorgudaki row_number = 1 koşulu da her grubun ilk, yani en yeni kaydını seçer. Veritabanı sisteminiz bu sorgudaki alt sorgu veya pencere işlevi sözdizimini farklı yorumluyorsa aynı mantığı sisteminizin desteklediği biçimde uygulamanız gerekir.

Tarih sütunu yoksa ne yapılmalı?​


Tabloda created_at, updated_at veya benzeri bir zaman sütunu yoksa en yeni kaydı güvenilir biçimde bulamazsınız. id sütununa göre azalan sıralama yalnızca id değerleri oluşturulma sırasını kesin olarak temsil ediyorsa işe yarar. Bu ilişki garanti edilmiyorsa sonuç, en son eklenen kaydı kanıtlamaz.

Bu durumda önce tablonun hangi sütununun kayıt zamanını tuttuğunu belirleyin. Uygun bir zaman sütunu yoksa tablo tasarımına kayıt oluşturulma zamanını saklayan bir alan eklemek ve yeni kayıt eklenirken bu alanı doldurmak gerekir. Mevcut satırlar için sonradan üretilecek tarihler gerçek oluşturulma zamanını göstermeyeceğinden, bu satırlarla ilgili “en yeni kayıt” sonucu kesin kabul edilmemelidir.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic