MySQL'den son N satırı seçin


121

MySQL veritabanından birincil anahtar olan id adlı sütun içinde son 50 satırı seçmek istiyorum . Hedef satır sıralanabilir gerektiğidir kimliği içinde ASC bu sorgu neden çalışmadığını amacıyla, işte

SELECT 
    *
FROM
    `table`
ORDER BY id DESC
LIMIT 50;

Ayrıca satırların manipüle edilebilmesi (silinmesi) olağanüstüdür ve bu nedenle aşağıdaki sorgu da çalışmıyor

SELECT 
    *
FROM
    `table`
WHERE
    id > ((SELECT 
            MAX(id)
        FROM
            chat) - 50)
ORDER BY id ASC;

Soru : MySQL veritabanından ASC düzeninde olan ve manipüle edilebilen son N satırı almak nasıl mümkün olabilir?

Yanıtlar:


236

Bunu bir alt sorgu ile yapabilirsiniz:

SELECT * FROM (
    SELECT * FROM table ORDER BY id DESC LIMIT 50
) sub
ORDER BY id ASC

Bu, içinden son 50 satırı seçecek tableve ardından bunları artan sırada sıralayacaktır.


5
^ Bilginize, bu makalenin MySQL hakkında olduğunu biliyorum, ancak @ DiegoDD'nin yukarıdaki yorumuna yanıt olarak, harici seçim ve takma adın Postgres'te (9.3.5) işe yaramayacağını belirtmek istedim. 'Hata: birden çok ORDER BY yan tümcesine izin verilmiyor' mesajı alıyorum. Ancak kabul edilen cevap Postgres'te beklendiği gibi çalışıyor
allenwlee

Bunun için teşekkürler! Bu sorgu sorunumu çözmeme yardımcı oldu. Bunu saatlerdir arıyordum
Arshad

1
Bu sorguyu JOINS ile nasıl uygulayabilirim?
GYaN

@GYaN iç alt sorguda katılımları ekle
şeyh hamza

9
SELECT * FROM table ORDER BY id DESC,datechat desc LIMIT 50

Sohbetin gönderildiği tarihi (ve saati) veya artımlı olarak (DESC'ye göre sırala) veya art arda (ASC'ye göre sırala) veri ile doldurulan herhangi bir alanı, satır başına ikinci sütun olarak depolayan bir tarih alanınız varsa hangi verilerin sıralanması gerekir.

Benim için çalışan buydu !!!! umarım yardımcı olur !!!!


7
SELECT * FROM table ORDER BY id DESC LIMIT 50

kaynakları koru bir sorgu yapar, iç içe geçmiş sorgular yapmaya gerek yoktur


1
Sorgunuz sonuçları tersine (azalan id) döndürür. @ newfurniturey'nin sorgusu, SON eklenen satırları ( LIMITazalan kimliğe göre) alacak ve nihai sonuç artan kimliklere sahip olacaktır.
Robin Kanters

1
Çözümünüz, sonuçları doğru sırayla almayacak, tersine
çevirecek,

1
Ama sonra sadece bir php array_reverse () ya da seçtiğiniz kodlama dilinde eşdeğeri ne olursa olsun yaparsınız. Veritabanının bu işi yapması gerekmez.
Joe

6
@Joe Soruda bir betik dilinin kullanıldığını gösteren hiçbir şey yok, bu yüzden bu güvenli bir varsayım değil.
Nick Coons

Beklenen yanıt, yalnızca veritabanı sorgusu kullanılarak zaten sıralanmalıdır.
d4ryl3

-2
select * from Table ORDER BY id LIMIT 30

Notlar: * idbenzersiz olmalıdır. * 30Sorgudaki yerini değiştirerek döndürülen satır sayısını kontrol edebilirsiniz


1
Lütfen çözümünüzü açıklar mısınız? Parantez içindeki açıklama kod gibi görünüyor, kodunuzun üstüne / altına tam bir cümle koyun. Teşekkürler
deHaar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.